rnd-20060111-1-src
[rocksndiamonds.git] / src / editor.c
index 2a4700546c28d3b07816007ffd1dc0c841b9960f..c2d1ba50a78b5852c2f29e2809e8c82a016876a3 100644 (file)
 /* yamyam content */
 #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 +              \
+#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (11 * ED_SETTINGS_YOFFSET +     \
                                         6 * ((n) / 4) * MINI_TILEY)
 
 /* magic ball content */
 #define ED_AREA_MAGIC_BALL_CONTENT_XPOS(n) (2 * MINI_TILEX +           \
                                            5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_MAGIC_BALL_CONTENT_YPOS(n) (17 * MINI_TILEY +          \
+#define ED_AREA_MAGIC_BALL_CONTENT_YPOS(n) (12 * ED_SETTINGS_YOFFSET + \
                                            6 * ((n) / 4) * MINI_TILEY)
 
 /* values for scrolling gadgets for drawing area */
 #define ED_TEXTBUTTON_XSIZE            ED_WIN_COUNT_XSIZE
 #define ED_TEXTBUTTON_YSIZE            ED_WIN_COUNT_YSIZE
 
-/* values for ClearEditorGadgetInfoText() and HandleGadgetInfoText() */
+/* values for ClearEditorGadgetInfoText() and HandleEditorGadgetInfoText() */
 #define INFOTEXT_XPOS                  SX
 #define INFOTEXT_YPOS                  (SY + SYSIZE - MINI_TILEX + 2)
 #define INFOTEXT_XSIZE                 SXSIZE
 #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_ENVELOPE_XSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 36)
-#define GADGET_ID_ENVELOPE_XSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 37)
-#define GADGET_ID_ENVELOPE_XSIZE_UP    (GADGET_ID_COUNTER_FIRST + 38)
-#define GADGET_ID_ENVELOPE_YSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 39)
-#define GADGET_ID_ENVELOPE_YSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 40)
-#define GADGET_ID_ENVELOPE_YSIZE_UP    (GADGET_ID_COUNTER_FIRST + 41)
-#define GADGET_ID_CUSTOM_SCORE_DOWN    (GADGET_ID_COUNTER_FIRST + 42)
-#define GADGET_ID_CUSTOM_SCORE_TEXT    (GADGET_ID_COUNTER_FIRST + 43)
-#define GADGET_ID_CUSTOM_SCORE_UP      (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_CUSTOM_GEMCOUNT_UP   (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_CUSTOM_VALUE_FIX_UP  (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_CUSTOM_VALUE_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_CUSTOM_VALUE_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_CUSTOM_VALUE_RND_UP  (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_PUSH_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_PUSH_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_PUSH_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_PUSH_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_PUSH_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_PUSH_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_DROP_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_DROP_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_DROP_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 62)
-#define GADGET_ID_DROP_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 63)
-#define GADGET_ID_DROP_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 64)
-#define GADGET_ID_DROP_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 65)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 66)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 67)
-#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 68)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 69)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 70)
-#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 71)
-#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 72)
-#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 73)
-#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 74)
-#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 75)
-#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 76)
-#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 77)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 78)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 79)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 80)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 81)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 82)
-#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 83)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 84)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 85)
-#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 86)
-#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 87)
-#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 88)
-#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 89)
+#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)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 96)
 
 #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_MAGIC_BALL_CONTENT_5 (GADGET_ID_DRAWING_AREA_FIRST + 14)
 #define GADGET_ID_MAGIC_BALL_CONTENT_6 (GADGET_ID_DRAWING_AREA_FIRST + 15)
 #define GADGET_ID_MAGIC_BALL_CONTENT_7 (GADGET_ID_DRAWING_AREA_FIRST + 16)
-#define GADGET_ID_AMOEBA_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 17)
-#define GADGET_ID_START_ELEMENT                (GADGET_ID_DRAWING_AREA_FIRST + 18)
-#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 19)
-#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 20)
-#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 26)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_ANDROID_CONTENT      (GADGET_ID_DRAWING_AREA_FIRST + 17)
+#define GADGET_ID_AMOEBA_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 18)
+#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)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 31)
 
 #define GADGET_ID_LEVEL_NAME           (GADGET_ID_TEXT_INPUT_FIRST + 0)
 #define GADGET_ID_LEVEL_AUTHOR         (GADGET_ID_TEXT_INPUT_FIRST + 1)
 #define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 5)
 #define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 6)
 #define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_DOUBLE_SPEED         (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#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_DOUBLE_SPEED         (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 47)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 48)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_COUNTER_ID_ELEMENT_VALUE3   9
 #define ED_COUNTER_ID_ELEMENT_VALUE4   10
 #define ED_COUNTER_ID_YAMYAM_CONTENT   11
-#define ED_COUNTER_ID_ENVELOPE_XSIZE   12
-#define ED_COUNTER_ID_ENVELOPE_YSIZE   13
-#define ED_COUNTER_ID_CUSTOM_SCORE     14
-#define ED_COUNTER_ID_CUSTOM_GEMCOUNT  15
-#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 16
-#define ED_COUNTER_ID_CUSTOM_VALUE_RND 17
-#define ED_COUNTER_ID_PUSH_DELAY_FIX   18
-#define ED_COUNTER_ID_PUSH_DELAY_RND   19
-#define ED_COUNTER_ID_DROP_DELAY_FIX   20
-#define ED_COUNTER_ID_DROP_DELAY_RND   21
-#define ED_COUNTER_ID_MOVE_DELAY_FIX   22
-#define ED_COUNTER_ID_MOVE_DELAY_RND   23
-#define ED_COUNTER_ID_EXPLOSION_DELAY  24
-#define ED_COUNTER_ID_IGNITION_DELAY   25
-#define ED_COUNTER_ID_GROUP_CONTENT    26
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 27
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 28
-#define ED_COUNTER_ID_CHANGE_CONT_RND  29
-
-#define ED_NUM_COUNTERBUTTONS          30
+#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_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
 #define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     3
 #define ED_CHECKBUTTON_ID_USE_SPRING_BUG       4
 #define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     5
-#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   6
-#define ED_CHECKBUTTON_ID_DOUBLE_SPEED         7
-#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     8
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     9
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  10
-#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   11
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    12
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 13
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   14
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   15
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    16
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   17
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  18
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    19
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        20
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        21
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        22
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        23
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      24
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      25
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     26
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      27
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                28
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   29
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  30
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 31
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        32
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    33
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         34
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 35
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  36
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 37
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   38
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 39
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    40
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    41
-
-#define ED_NUM_CHECKBUTTONS                    42
+#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_DOUBLE_SPEED         9
+#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     10
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     11
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  12
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   13
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    14
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  15
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        16
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   18
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   19
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    20
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   21
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  22
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    23
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        24
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        25
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        26
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        27
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      28
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      29
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     30
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      31
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                32
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   33
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  34
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 35
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        36
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    37
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         38
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 39
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  40
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 41
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   42
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    44
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    45
+
+#define ED_NUM_CHECKBUTTONS                    46
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_5     14
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_6     15
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7     16
-#define ED_DRAWING_ID_AMOEBA_CONTENT           17
-#define ED_DRAWING_ID_START_ELEMENT            18
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC           19
-#define ED_DRAWING_ID_CUSTOM_CONTENT           20
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                21
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                22
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     23
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    24
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    25
-#define ED_DRAWING_ID_GROUP_CONTENT            26
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                27
-
-#define ED_NUM_DRAWING_AREAS                   28
+#define ED_DRAWING_ID_ANDROID_CONTENT          17
+#define ED_DRAWING_ID_AMOEBA_CONTENT           18
+#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_NUM_DRAWING_AREAS                   31
 
 
 /*
@@ -1076,6 +1098,22 @@ static struct
     &level.num_yamyam_contents,
     NULL,                              NULL, "number of content areas"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    MIN_ELEMENT_CONTENTS,              MAX_ELEMENT_CONTENTS,
+    GADGET_ID_BALL_CONTENT_DOWN,       GADGET_ID_BALL_CONTENT_UP,
+    GADGET_ID_BALL_CONTENT_TEXT,       GADGET_ID_NONE,
+    &level.num_ball_contents,
+    NULL,                              NULL, "number of content areas"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    MIN_ANDROID_ELEMENTS,              MAX_ANDROID_ELEMENTS,
+    GADGET_ID_ANDROID_CONTENT_DOWN,    GADGET_ID_ANDROID_CONTENT_UP,
+    GADGET_ID_ANDROID_CONTENT_TEXT,    GADGET_ID_NONE,
+    &level.num_android_clone_elements,
+    NULL,                              NULL, "number of clonable elements"
+  },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     MIN_ENVELOPE_XSIZE,                        MAX_ENVELOPE_XSIZE,
@@ -1482,6 +1520,8 @@ static struct ValueTextInfo options_change_direct_action[] =
 {
   { CE_TOUCHED_BY_PLAYER,      "touched by player"             },
   { CE_PRESSED_BY_PLAYER,      "pressed by player"             },
+  { CE_SWITCHED_BY_PLAYER,     "switched by player"            },
+  { CE_SNAPPED_BY_PLAYER,      "snapped by player"             },
   { CE_PUSHED_BY_PLAYER,       "pushed by player"              },
   { CE_ENTERED_BY_PLAYER,      "entered by player"             },
   { CE_LEFT_BY_PLAYER,         "left by player"                },
@@ -1503,6 +1543,8 @@ static struct ValueTextInfo options_change_other_action[] =
 {
   { CE_PLAYER_TOUCHES_X,       "player touches"                },
   { CE_PLAYER_PRESSES_X,       "player presses"                },
+  { CE_PLAYER_SWITCHES_X,      "player switches"               },
+  { CE_PLAYER_SNAPS_X,         "player snaps"                  },
   { CE_PLAYER_PUSHES_X,                "player pushes"                 },
   { CE_PLAYER_ENTERS_X,                "player enters"                 },
   { CE_PLAYER_LEAVES_X,                "player leaves"                 },
@@ -1511,10 +1553,13 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_PLAYER_DROPS_X,         "player drops/throws"           },
   { CE_TOUCHING_X,             "touching"                      },
   { CE_HITTING_X,              "hitting"                       },
+  { CE_DIGGING_X,              "digging"                       },
   { CE_HIT_BY_X,               "hit by"                        },
   { CE_SWITCH_OF_X,            "switch of"                     },
   { CE_CHANGE_OF_X,            "change by page of"             },
   { CE_EXPLOSION_OF_X,         "explosion of"                  },
+  { CE_MOVE_OF_X,              "move of"                       },
+  { CE_CREATION_OF_X,          "creation of"                   },
   { CE_VALUE_GETS_ZERO_OF_X,   "CE value gets 0 of"            },
 
   { -1,                                NULL                            }
@@ -1620,6 +1665,9 @@ static struct ValueTextInfo options_action_type[] =
   { CA_HEADLINE_CE_ACTIONS,    "[CE actions]"                  },
   { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_SET_CE_VALUE,           "set CE value"                  },
+  { CA_UNDEFINED,              " "                             },
+  { CA_HEADLINE_ENGINE_ACTIONS,        "[engine actions]"              },
+  { CA_SET_ENGINE_SCAN_MODE,   "set scan mode"                 },
 
   { -1,                                NULL                            }
 };
@@ -1781,6 +1829,8 @@ static struct ValueTextInfo options_action_arg_artwork[] =
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
   { CA_ARG_ELEMENT_TRIGGER,    "trigger"                       },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_ELEMENT_RESET,      "reset"                         },
 
   { -1,                                NULL                            }
 };
@@ -1809,6 +1859,15 @@ static struct ValueTextInfo options_action_arg_direction[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_action_arg_scan_mode[] =
+{
+  { CA_ARG_SCAN_MODE_HEADLINE, "[mode]"                        },
+  { CA_ARG_SCAN_MODE_NORMAL,   "normal"                        },
+  { CA_ARG_SCAN_MODE_REVERSE,  "reverse"                       },
+
+  { -1,                                NULL                            }
+};
+
 static char options_change_page_strings[MAX_CHANGE_PAGES][10];
 static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
 {
@@ -1859,6 +1918,7 @@ action_arg_options[] =
   { CA_SET_PLAYER_ARTWORK,     1,      options_action_arg_artwork,     },
   { CA_SET_CE_SCORE,           3,      options_action_arg_number,      },
   { CA_SET_CE_VALUE,           3,      options_action_arg_number,      },
+  { CA_SET_ENGINE_SCAN_MODE,   1,      options_action_arg_scan_mode,   },
 
   { -1,                                FALSE,  NULL                            }
 };
@@ -2381,6 +2441,20 @@ static struct
     NULL,
     "use time orb bug",                        "use odd time orb behaviour"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_RANDOM_BALL_CONTENT,     GADGET_ID_NONE,
+    &level.ball_random,
+    NULL,
+    "create single random element",    "only create one element from content"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_INITIAL_BALL_STATE,      GADGET_ID_NONE,
+    &level.ball_state_initial,
+    NULL,
+    "magic ball initially activated",  "activate magic ball after level start"
+  },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_GROW_INTO_DIGGABLE,      GADGET_ID_NONE,
@@ -2389,56 +2463,70 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_DOUBLE_SPEED,            GADGET_ID_NONE,
     &level.double_speed,
     NULL,
     "double speed movement",           "set initial movement speed of player"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
-    "block snap field when snapping",  "use snapping delay to show animation"
+    "block snapped field when snapping", "use snapping delay to show animation"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_INSTANT_RELOCATION,      GADGET_ID_NONE,
     &level.instant_relocation,
     NULL,
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_USE_START_ELEMENT,       GADGET_ID_NONE,
     &level.use_start_element[0],
     NULL,
     "use level start element:",               "start level at this element's position"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    GADGET_ID_USE_ARTWORK_ELEMENT,     GADGET_ID_NONE,
+    &level.use_artwork_element[0],
+    NULL,
+    "use artwork from element:",       "use player artwork from other element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
+    GADGET_ID_USE_EXPLOSION_ELEMENT,   GADGET_ID_NONE,
+    &level.use_explosion_element[0],
+    NULL,
+    "use explosion from element:",     "use explosion properties from element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
     NULL,
     "can pass to walkable element",    "player can pass to empty or walkable"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CAN_FALL_INTO_ACID,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
     NULL,
@@ -2746,6 +2834,15 @@ static struct
     NULL, NULL, "8",                   NULL
   },
 
+  /* ---------- android content -------------------------------------------- */
+
+  {
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(5),
+    GADGET_ID_ANDROID_CONTENT,         GADGET_ID_NONE,
+    &level.android_clone_element[0],   MAX_ANDROID_ELEMENTS, 1,
+    "elements:", NULL, NULL,           "elements android can clone"
+  },
+
   /* ---------- amoeba content --------------------------------------------- */
 
   {
@@ -2758,12 +2855,30 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(6),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(7),
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
     NULL, NULL, NULL,                  "level start element"
   },
 
+  /* ---------- player artwork element ------------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(8),
+    GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
+    &level.artwork_element[0],         1, 1,
+    NULL, NULL, NULL,                  "element for player artwork"
+  },
+
+  /* ---------- player explosion element ----------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
+    &level.explosion_element[0],       1, 1,
+    NULL, NULL, NULL,                  "element for player explosion"
+  },
+
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
   /* ---------- custom graphic --------------------------------------------- */
@@ -2882,6 +2997,7 @@ static void ModifyEditorSelectboxValue(int, int);
 static void ModifyEditorSelectboxOptions(int, struct ValueTextInfo *);
 static void ModifyEditorDrawingArea(int, int, int);
 static void ModifyEditorElementList();
+static void AdjustElementListScrollbar();
 static void RedrawDrawingElements();
 static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
@@ -2900,6 +3016,7 @@ static void HandleRadiobuttons(struct GadgetInfo *);
 static void HandleCheckbuttons(struct GadgetInfo *);
 static void HandleControlButtons(struct GadgetInfo *);
 static void HandleDrawingAreaInfo(struct GadgetInfo *);
+static void PrintEditorGadgetInfoText(struct GadgetInfo *);
 
 static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS];
 static int right_gadget_border[NUM_EDITOR_GADGETS];
@@ -2921,6 +3038,12 @@ static int element_shift = 0;
 
 static int editor_hl_boulderdash[] =
 {
+  EL_INTERNAL_CASCADE_BD_ACTIVE,
+  EL_CHAR('B'),
+  EL_CHAR('D'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('B'),
   EL_CHAR('O'),
   EL_CHAR('U'),
@@ -2935,6 +3058,7 @@ static int editor_hl_boulderdash[] =
   EL_CHAR('A'),
   EL_CHAR('S'),
   EL_CHAR('H'),
+#endif
 };
 
 static int editor_el_boulderdash[] =
@@ -2971,6 +3095,12 @@ static int num_editor_el_boulderdash = SIZEOF_ARRAY_INT(editor_el_boulderdash);
 
 static int editor_hl_emerald_mine[] =
 {
+  EL_INTERNAL_CASCADE_EM_ACTIVE,
+  EL_CHAR('E'),
+  EL_CHAR('M'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('E'),
   EL_CHAR('M'),
   EL_CHAR('E'),
@@ -2985,6 +3115,7 @@ static int editor_hl_emerald_mine[] =
   EL_CHAR('I'),
   EL_CHAR('N'),
   EL_CHAR('E'),
+#endif
 };
 
 static int editor_el_emerald_mine[] =
@@ -3071,6 +3202,12 @@ static int num_editor_el_emerald_mine=SIZEOF_ARRAY_INT(editor_el_emerald_mine);
 
 static int editor_hl_emerald_mine_club[] =
 {
+  EL_INTERNAL_CASCADE_EMC_ACTIVE,
+  EL_CHAR('E'),
+  EL_CHAR('M'),
+  EL_CHAR('C'),
+
+#if 0
   EL_CHAR('E'),
   EL_CHAR('M'),
   EL_CHAR('E'),
@@ -3090,6 +3227,7 @@ static int editor_hl_emerald_mine_club[] =
   EL_CHAR('L'),
   EL_CHAR('U'),
   EL_CHAR('B'),
+#endif
 };
 
 static int editor_el_emerald_mine_club[] =
@@ -3139,18 +3277,10 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_WALL_11,
   EL_EMC_WALL_12,
 
-#if RELEASE_3_1_2
-  EL_EMPTY,
-#else
   EL_EMC_ANDROID,
-#endif
   EL_BALLOON,
   EL_BALLOON_SWITCH_ANY,
-#if RELEASE_3_1_2
-  EL_EMPTY,
-#else
   EL_BALLOON_SWITCH_NONE,
-#endif
 
   EL_BALLOON_SWITCH_LEFT,
   EL_BALLOON_SWITCH_RIGHT,
@@ -3159,32 +3289,18 @@ static int editor_el_emerald_mine_club[] =
 
   EL_EMC_GRASS,
   EL_EMC_PLANT,
-#if RELEASE_3_1_2
-  EL_EMPTY,
-  EL_EMPTY,
-#else
   EL_EMC_LENSES,
   EL_EMC_MAGNIFIER,
-#endif
 
-#if RELEASE_3_1_2
-  EL_EMPTY,
-  EL_EMPTY,
-#else
   EL_EMC_MAGIC_BALL,
   EL_EMC_MAGIC_BALL_SWITCH,
-#endif
   EL_SPRING,
-#if RELEASE_3_1_2
-  EL_EMPTY,
-#else
   EL_EMC_SPRING_BUMPER,
-#endif
 
-#if RELEASE_3_1_2
-  EL_EMPTY,
-#else
+#if 0
   EL_EMC_DRIPPER,
+#else
+  EL_EMPTY,
 #endif
   EL_EMC_FAKE_GRASS,
   EL_EMPTY,
@@ -3197,10 +3313,17 @@ static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mi
 
 static int editor_hl_more[] =
 {
+  EL_INTERNAL_CASCADE_RND_ACTIVE,
+  EL_CHAR('R'),
+  EL_CHAR('N'),
+  EL_CHAR('D'),
+
+#if 0
   EL_CHAR('M'),
   EL_CHAR('O'),
   EL_CHAR('R'),
   EL_CHAR('E'),
+#endif
 };
 
 static int editor_el_more[] =
@@ -3292,6 +3415,12 @@ static int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more);
 
 static int editor_hl_sokoban[] =
 {
+  EL_INTERNAL_CASCADE_SB_ACTIVE,
+  EL_CHAR('S'),
+  EL_CHAR('B'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('S'),
   EL_CHAR('O'),
   EL_CHAR('K'),
@@ -3301,6 +3430,7 @@ static int editor_hl_sokoban[] =
   EL_CHAR('B'),
   EL_CHAR('A'),
   EL_CHAR('N'),
+#endif
 };
 
 static int editor_el_sokoban[] =
@@ -3317,6 +3447,12 @@ static int num_editor_el_sokoban = SIZEOF_ARRAY_INT(editor_el_sokoban);
 
 static int editor_hl_supaplex[] =
 {
+  EL_INTERNAL_CASCADE_SP_ACTIVE,
+  EL_CHAR('S'),
+  EL_CHAR('P'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('S'),
   EL_CHAR('U'),
   EL_CHAR('P'),
@@ -3326,6 +3462,7 @@ static int editor_hl_supaplex[] =
   EL_CHAR('L'),
   EL_CHAR('E'),
   EL_CHAR('X'),
+#endif
 };
 
 static int editor_el_supaplex[] =
@@ -3391,6 +3528,12 @@ static int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex);
 
 static int editor_hl_diamond_caves[] =
 {
+  EL_INTERNAL_CASCADE_DC_ACTIVE,
+  EL_CHAR('D'),
+  EL_CHAR('C'),
+  EL_CHAR('2'),
+
+#if 0
   EL_CHAR('D'),
   EL_CHAR('I'),
   EL_CHAR('A'),
@@ -3410,6 +3553,7 @@ static int editor_hl_diamond_caves[] =
   EL_CHAR(' '),
   EL_CHAR('I'),
   EL_CHAR('I'),
+#endif
 };
 
 static int editor_el_diamond_caves[] =
@@ -3486,6 +3630,12 @@ static int num_editor_el_diamond_caves = SIZEOF_ARRAY_INT(editor_el_diamond_cave
 
 static int editor_hl_dx_boulderdash[] =
 {
+  EL_INTERNAL_CASCADE_DX_ACTIVE,
+  EL_CHAR('D'),
+  EL_CHAR('X'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('D'),
   EL_CHAR('X'),
   EL_CHAR('-'),
@@ -3505,6 +3655,7 @@ static int editor_hl_dx_boulderdash[] =
   EL_CHAR('A'),
   EL_CHAR('S'),
   EL_CHAR('H'),
+#endif
 };
 
 static int editor_el_dx_boulderdash[] =
@@ -3536,10 +3687,17 @@ static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderd
 
 static int editor_hl_chars[] =
 {
+  EL_INTERNAL_CASCADE_CHARS_ACTIVE,
+  EL_CHAR('T'),
+  EL_CHAR('X'),
+  EL_CHAR('T'),
+
+#if 0
   EL_CHAR('T'),
   EL_CHAR('E'),
   EL_CHAR('X'),
   EL_CHAR('T'),
+#endif
 };
 
 static int editor_el_chars[] =
@@ -3641,6 +3799,12 @@ static int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars);
 
 static int editor_hl_custom[] =
 {
+  EL_INTERNAL_CASCADE_CE_ACTIVE,
+  EL_CHAR('C'),
+  EL_CHAR('E'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('C'),
   EL_CHAR('U'),
   EL_CHAR('S'),
@@ -3660,6 +3824,7 @@ static int editor_hl_custom[] =
   EL_CHAR('N'),
   EL_CHAR('T'),
   EL_CHAR('S'),
+#endif
 };
 
 static int editor_el_custom[] =
@@ -3822,19 +3987,8 @@ static int editor_el_custom[] =
   EL_CUSTOM_START + 124,
   EL_CUSTOM_START + 125,
   EL_CUSTOM_START + 126,
-  EL_CUSTOM_START + 127
-};
-static int *editor_hl_custom_ptr = editor_hl_custom;
-static int *editor_el_custom_ptr = editor_el_custom;
-static int num_editor_hl_custom = SIZEOF_ARRAY_INT(editor_hl_custom);
-static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
+  EL_CUSTOM_START + 127,
 
-static int editor_hl_custom_more[] =
-{
-};
-
-static int editor_el_custom_more[] =
-{
   EL_CUSTOM_START + 128,
   EL_CUSTOM_START + 129,
   EL_CUSTOM_START + 130,
@@ -3993,31 +4147,26 @@ static int editor_el_custom_more[] =
   EL_CUSTOM_START + 252,
   EL_CUSTOM_START + 253,
   EL_CUSTOM_START + 254,
-  EL_CUSTOM_START + 255
-};
-static int *editor_hl_custom_more_ptr = editor_hl_custom_more;
-static int *editor_el_custom_more_ptr = editor_el_custom_more;
-static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more);
-static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
+  EL_CUSTOM_START + 255,
 
-static int editor_hl_custom_special[] =
-{
-};
-
-static int editor_el_custom_special[] =
-{
   EL_TRIGGER_ELEMENT,
   EL_TRIGGER_PLAYER,
   EL_EMPTY,
   EL_EMPTY
 };
-static int *editor_hl_custom_special_ptr = editor_hl_custom_special;
-static int *editor_el_custom_special_ptr = editor_el_custom_special;
-static int num_editor_hl_custom_special = SIZEOF_ARRAY_INT(editor_hl_custom_special);
-static int num_editor_el_custom_special = SIZEOF_ARRAY_INT(editor_el_custom_special);
+static int *editor_hl_custom_ptr = editor_hl_custom;
+static int *editor_el_custom_ptr = editor_el_custom;
+static int num_editor_hl_custom = SIZEOF_ARRAY_INT(editor_hl_custom);
+static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
 
 static int editor_hl_group[] =
 {
+  EL_INTERNAL_CASCADE_GE_ACTIVE,
+  EL_CHAR('G'),
+  EL_CHAR('E'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('G'),
   EL_CHAR('R'),
   EL_CHAR('O'),
@@ -4037,6 +4186,7 @@ static int editor_hl_group[] =
   EL_CHAR('N'),
   EL_CHAR('T'),
   EL_CHAR('S'),
+#endif
 };
 
 static int editor_el_group[] =
@@ -4059,19 +4209,8 @@ static int editor_el_group[] =
   EL_GROUP_START + 12,
   EL_GROUP_START + 13,
   EL_GROUP_START + 14,
-  EL_GROUP_START + 15
-};
-static int *editor_hl_group_ptr = editor_hl_group;
-static int *editor_el_group_ptr = editor_el_group;
-static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
-static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
-
-static int editor_hl_group_more[] =
-{
-};
+  EL_GROUP_START + 15,
 
-static int editor_el_group_more[] =
-{
   EL_GROUP_START + 16,
   EL_GROUP_START + 17,
   EL_GROUP_START + 18,
@@ -4092,13 +4231,19 @@ static int editor_el_group_more[] =
   EL_GROUP_START + 30,
   EL_GROUP_START + 31
 };
-static int *editor_hl_group_more_ptr = editor_hl_group_more;
-static int *editor_el_group_more_ptr = editor_el_group_more;
-static int num_editor_hl_group_more = SIZEOF_ARRAY_INT(editor_hl_group_more);
-static int num_editor_el_group_more = SIZEOF_ARRAY_INT(editor_el_group_more);
+static int *editor_hl_group_ptr = editor_hl_group;
+static int *editor_el_group_ptr = editor_el_group;
+static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
+static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
 
 static int editor_hl_user_defined[] =
 {
+  EL_INTERNAL_CASCADE_USER_ACTIVE,
+  EL_CHAR('M'),
+  EL_CHAR('Y'),
+  EL_EMPTY,
+
+#if 0
   EL_CHAR('U'),
   EL_CHAR('S'),
   EL_CHAR('E'),
@@ -4113,6 +4258,7 @@ static int editor_hl_user_defined[] =
   EL_CHAR('N'),
   EL_CHAR('E'),
   EL_CHAR('D'),
+#endif
 };
 
 static int *editor_hl_user_defined_ptr = editor_hl_user_defined;
@@ -4120,6 +4266,19 @@ static int *editor_el_user_defined_ptr = NULL;
 static int num_editor_hl_user_defined=SIZEOF_ARRAY_INT(editor_hl_user_defined);
 static int num_editor_el_user_defined = 0;
 
+static int editor_hl_dynamic[] =
+{
+  EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE,
+  EL_CHAR('U'),
+  EL_CHAR('S'),
+  EL_CHAR('E'),
+};
+
+static int *editor_hl_dynamic_ptr = editor_hl_dynamic;
+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_el_empty[ED_NUM_ELEMENTLIST_BUTTONS];
 
@@ -4136,6 +4295,7 @@ static int num_editor_elements = 0;       /* dynamically determined */
 static struct
 {
   boolean *setup_value;
+  boolean *setup_cascade_value;
 
   int **headline_list;
   int *headline_list_size;
@@ -4149,85 +4309,90 @@ editor_elements_info[] =
 {
   {
     &setup.editor.el_boulderdash,
+    &setup.editor_cascade.el_bd,
     &editor_hl_boulderdash_ptr,                &num_editor_hl_boulderdash,
     &editor_el_boulderdash_ptr,                &num_editor_el_boulderdash
   },
   {
     &setup.editor.el_emerald_mine,
+    &setup.editor_cascade.el_em,
     &editor_hl_emerald_mine_ptr,       &num_editor_hl_emerald_mine,
     &editor_el_emerald_mine_ptr,       &num_editor_el_emerald_mine
   },
   {
     &setup.editor.el_emerald_mine_club,
+    &setup.editor_cascade.el_emc,
     &editor_hl_emerald_mine_club_ptr,  &num_editor_hl_emerald_mine_club,
     &editor_el_emerald_mine_club_ptr,  &num_editor_el_emerald_mine_club
   },
   {
     &setup.editor.el_more,
+    &setup.editor_cascade.el_rnd,
     &editor_hl_more_ptr,               &num_editor_hl_more,
     &editor_el_more_ptr,               &num_editor_el_more
   },
   {
     &setup.editor.el_sokoban,
+    &setup.editor_cascade.el_sb,
     &editor_hl_sokoban_ptr,            &num_editor_hl_sokoban,
     &editor_el_sokoban_ptr,            &num_editor_el_sokoban
   },
   {
     &setup.editor.el_supaplex,
+    &setup.editor_cascade.el_sp,
     &editor_hl_supaplex_ptr,           &num_editor_hl_supaplex,
     &editor_el_supaplex_ptr,           &num_editor_el_supaplex
   },
   {
     &setup.editor.el_diamond_caves,
+    &setup.editor_cascade.el_dc,
     &editor_hl_diamond_caves_ptr,      &num_editor_hl_diamond_caves,
     &editor_el_diamond_caves_ptr,      &num_editor_el_diamond_caves
   },
   {
     &setup.editor.el_dx_boulderdash,
+    &setup.editor_cascade.el_dx,
     &editor_hl_dx_boulderdash_ptr,     &num_editor_hl_dx_boulderdash,
     &editor_el_dx_boulderdash_ptr,     &num_editor_el_dx_boulderdash
   },
   {
     &setup.editor.el_chars,
+    &setup.editor_cascade.el_chars,
     &editor_hl_chars_ptr,              &num_editor_hl_chars,
     &editor_el_chars_ptr,              &num_editor_el_chars
   },
   {
     &setup.editor.el_custom,
+    &setup.editor_cascade.el_ce,
     &editor_hl_custom_ptr,             &num_editor_hl_custom,
     &editor_el_custom_ptr,             &num_editor_el_custom
   },
-  {
-    &setup.editor.el_custom_more,
-    &editor_hl_custom_more_ptr,                &num_editor_hl_custom_more,
-    &editor_el_custom_more_ptr,                &num_editor_el_custom_more
-  },
-  {
-    &setup.editor.el_custom,
-    &editor_hl_custom_special_ptr,     &num_editor_hl_custom_special,
-    &editor_el_custom_special_ptr,     &num_editor_el_custom_special
-  },
   {
     &setup.editor.el_custom,
+    &setup.editor_cascade.el_ge,
     &editor_hl_group_ptr,              &num_editor_hl_group,
     &editor_el_group_ptr,              &num_editor_el_group
   },
-  {
-    &setup.editor.el_custom_more,
-    &editor_hl_group_more_ptr,         &num_editor_hl_group_more,
-    &editor_el_group_more_ptr,         &num_editor_el_group_more
-  },
   {
     &setup.editor.el_user_defined,
+    &setup.editor_cascade.el_user,
     &editor_hl_user_defined_ptr,       &num_editor_hl_user_defined,
     &editor_el_user_defined_ptr,       &num_editor_el_user_defined
   },
   {
+    &setup.editor.el_dynamic,
+    &setup.editor_cascade.el_dynamic,
+    &editor_hl_dynamic_ptr,            &num_editor_hl_dynamic,
+    &editor_el_dynamic_ptr,            &num_editor_el_dynamic,
+  },
+  {
+    &use_el_empty,
     &use_el_empty,
     &editor_hl_empty_ptr,              &num_editor_hl_empty,
     &editor_el_empty_ptr,              &num_editor_el_empty,
   },
   {
+    NULL,
     NULL,
     NULL,                              NULL,
     NULL,                              NULL
@@ -4271,7 +4436,11 @@ static char *getElementInfoText(int element)
 {
   char *info_text = NULL;
 
+#if 1
+  if (element < MAX_NUM_ELEMENTS)
+#else
   if (element < NUM_FILE_ELEMENTS)
+#endif
   {
     if (strlen(element_info[element].description) > 0)
       info_text = element_info[element].description;
@@ -4287,17 +4456,88 @@ static char *getElementInfoText(int element)
   return info_text;
 }
 
+static void InitDynamicEditorElementList(int **elements, int *num_elements)
+{
+  boolean element_found[NUM_FILE_ELEMENTS];
+  int i, x, y;
+
+  /* initialize list of used elements to "not used" */
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    element_found[i] = FALSE;
+
+  /* find all elements used in current level */
+  for (y = 0; y < lev_fieldy; y++)
+    for (x = 0; x < lev_fieldx; x++)
+      if (Feld[x][y] < NUM_FILE_ELEMENTS)      /* should always be true */
+       element_found[Feld[x][y]] = TRUE;
+
+  *num_elements = 0;
+
+  /* count number of elements used in current level */
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    if (element_found[i])
+      (*num_elements)++;
+
+  /* add space for up to 3 more elements for padding that may be needed */
+  *num_elements += 3;
+
+  /* free memory for old list of elements, if needed */
+  checked_free(*elements);
+
+  /* allocate memory for new list of elements */
+  *elements = checked_malloc(*num_elements * sizeof(int));
+
+  *num_elements = 0;
+
+  /* add all elements used in current level (non-custom/group elements) */
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    if (element_found[i] && !(IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+      (*elements)[(*num_elements)++] = i;
+
+  /* add all elements used in current level (custom/group elements) */
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    if (element_found[i] && (IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+      (*elements)[(*num_elements)++] = i;
+
+  while (*num_elements % 4)    /* pad with empty elements, if needed */
+    (*elements)[(*num_elements)++] = EL_EMPTY;
+}
+
 static void ReinitializeElementList()
 {
+  static boolean initialization_needed = TRUE;
   int pos = 0;
   int i, j;
 
+  if (initialization_needed)
+  {
+    LoadSetup_EditorCascade();         /* load last editor cascade state */
+
+    /* initialize editor cascade element from saved cascade state */
+    for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+    {
+      int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+      boolean cascade_value = *editor_elements_info[i].setup_cascade_value;
+
+      if (IS_EDITOR_CASCADE(*cascade_element))
+       *cascade_element =
+         (cascade_value ? EL_CASCADE_ACTIVE(*cascade_element) :
+          EL_CASCADE_INACTIVE(*cascade_element));
+    }
+
+    initialization_needed = FALSE;
+  }
+
   checked_free(editor_elements);
 
   /* reload optional user defined element list for each invocation of editor */
   LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr,
                                   &num_editor_el_user_defined);
 
+  /* initialize dynamic level element list for each invocation of editor */
+  InitDynamicEditorElementList(&editor_el_dynamic_ptr,
+                              &num_editor_el_dynamic);
+
   /* initialize list of empty elements (used for padding, if needed) */
   for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
     editor_el_empty[i] = EL_EMPTY;
@@ -4323,11 +4563,26 @@ static void ReinitializeElementList()
   /* determine size of element list */
   for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
   {
+    boolean found_inactive_cascade = FALSE;
+
     if (*editor_elements_info[i].setup_value)
     {
       if (setup.editor.el_headlines)
+      {
        num_editor_elements += *editor_elements_info[i].headline_list_size;
 
+       for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
+       {
+         int element = (*editor_elements_info[i].headline_list)[j];
+
+         if (IS_EDITOR_CASCADE_INACTIVE(element))
+           found_inactive_cascade = TRUE;
+       }
+      }
+
+      if (found_inactive_cascade)
+       continue;
+
       num_editor_elements += *editor_elements_info[i].element_list_size;
     }
   }
@@ -4346,22 +4601,33 @@ static void ReinitializeElementList()
   /* fill element list */
   for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
   {
+    boolean found_inactive_cascade = FALSE;
+
     if (*editor_elements_info[i].setup_value)
     {
       if (setup.editor.el_headlines)
+      {
        for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
-         editor_elements[pos++] = (*editor_elements_info[i].headline_list)[j];
+       {
+         int element = (*editor_elements_info[i].headline_list)[j];
+
+         editor_elements[pos++] = element;
+
+         if (IS_EDITOR_CASCADE_INACTIVE(element))
+           found_inactive_cascade = TRUE;
+       }
+      }
+
+      if (found_inactive_cascade)
+       continue;
 
       for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
        editor_elements[pos++] = (*editor_elements_info[i].element_list)[j];
     }
   }
 
-  /* correct position of element list scrollbar */
-  if (element_shift < 0)
-    element_shift = 0;
-  if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
-    element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+  /* (this function is also called before editor gadgets are initialized!) */
+  AdjustElementListScrollbar();
 }
 
 void PrintEditorElementList()
@@ -4371,10 +4637,25 @@ void PrintEditorElementList()
 
   for (i = 0; editor_elements_info[i].setup_value != stop; i++)
   {
+    int cascade_element = (*editor_elements_info[i].headline_list)[0];
+
+    if (IS_EDITOR_CASCADE(cascade_element))
+    {
+      int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element);
+      char *headline = element_info[cascade_element_show].editor_description;
+
+      printf_line_with_prefix("# ", "-", 77);
+      printf("# %s\n", headline);
+      printf_line_with_prefix("# ", "-", 77);
+    }
+
     for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
     {
       int element = (*editor_elements_info[i].headline_list)[j];
 
+      if (IS_EDITOR_CASCADE(element))
+       element = EL_CHAR_MINUS;
+
       printf("# %s\n", element_info[element].token_name);
     }
 
@@ -4434,6 +4715,10 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   int src_x, src_y;
   int num_mini_tilex = width  / MINI_TILEX + 1;
   int num_mini_tiley = height / MINI_TILEY + 1;
+  int from_x = dest_x - MINI_TILEX / 2;
+  int from_y = dest_y - MINI_TILEY / 2;
+  int to_x = from_x + num_mini_tilex * MINI_TILEX - 1;
+  int to_y = from_y + num_mini_tiley * MINI_TILEY - 1;
   int x, y;
 
   getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y);
@@ -4441,10 +4726,14 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   for (y = 0; y < num_mini_tiley; y++)
     for (x = 0; x < num_mini_tilex; x++)
       BlitBitmap(src_bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY,
-                dest_x - MINI_TILEX / 2 + x * MINI_TILEX,
-                dest_y - MINI_TILEY / 2 + y * MINI_TILEY);
+                from_x + x * MINI_TILEX, from_y + y * MINI_TILEY);
 
   ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
+
+  DrawSimpleBlackLine(drawto, from_x, from_y, to_x, from_y);
+  DrawSimpleBlackLine(drawto, to_x, from_y, to_x, to_y);
+  DrawSimpleBlackLine(drawto, to_x, to_y, from_x, to_y);
+  DrawSimpleBlackLine(drawto, from_x, to_y, from_x, from_y);
 }
 
 static void DrawDrawingArea(int id)
@@ -5487,7 +5776,11 @@ void FreeLevelEditorGadgets()
   int i;
 
   for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+  {
     FreeGadget(level_editor_gadget[i]);
+
+    level_editor_gadget[i] = NULL;
+  }
 }
 
 static void MapCounterButtons(int id)
@@ -5918,11 +6211,12 @@ static boolean LevelContainsPlayer()
 
   return TRUE;         /* !!! CURRENTLY DEACTIVATED !!! */
 
-  for (y = 0; y < lev_fieldy; y++) 
-    for (x = 0; x < lev_fieldx; x++)
-      if (Feld[x][y] == EL_PLAYER_1 ||
-         Feld[x][y] == EL_SP_MURPHY) 
-       player_found = TRUE;
+  for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++)
+  {
+    if (Feld[x][y] == EL_PLAYER_1 ||
+       Feld[x][y] == EL_SP_MURPHY) 
+      player_found = TRUE;
+  }
 
   return player_found;
 }
@@ -5952,6 +6246,32 @@ static int setSelectboxValue(int selectbox_id, int new_value)
   return new_index_value;
 }
 
+static void setSelectboxSpecialActionVariablesIfNeeded()
+{
+  int i;
+
+  /* change action mode and arg variables according to action type variable */
+  for (i = 0; action_arg_options[i].value != -1; i++)
+  {
+    if (action_arg_options[i].value == custom_element_change.action_type)
+    {
+      int mode = action_arg_options[i].mode;
+
+      /* only change if corresponding selectbox has changed */
+      if (selectbox_info[ED_SELECTBOX_ID_ACTION_MODE].options !=
+         action_arg_modes[mode])
+       custom_element_change.action_mode = -1;
+
+      /* only change if corresponding selectbox has changed */
+      if (selectbox_info[ED_SELECTBOX_ID_ACTION_ARG].options !=
+         action_arg_options[i].options)
+       custom_element_change.action_arg = -1;
+
+      break;
+    }
+  }
+}
+
 static void setSelectboxSpecialActionOptions()
 {
   int i;
@@ -5972,6 +6292,7 @@ static void setSelectboxSpecialActionOptions()
                                   action_arg_options[i].options);
       ModifyEditorSelectboxValue(ED_SELECTBOX_ID_ACTION_ARG,
                                 custom_element_change.action_arg);
+      break;
     }
   }
 }
@@ -6259,6 +6580,8 @@ static void CopyCustomElementPropertiesToEditor(int element)
   custom_element_change.direct_action =
     (HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER :
+     HAS_CHANGE_EVENT(element, CE_SWITCHED_BY_PLAYER) ? CE_SWITCHED_BY_PLAYER :
+     HAS_CHANGE_EVENT(element, CE_SNAPPED_BY_PLAYER) ? CE_SNAPPED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_ENTERED_BY_PLAYER) ? CE_ENTERED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER :
@@ -6276,6 +6599,8 @@ static void CopyCustomElementPropertiesToEditor(int element)
   custom_element_change.other_action =
     (HAS_CHANGE_EVENT(element, CE_PLAYER_TOUCHES_X) ? CE_PLAYER_TOUCHES_X :
      HAS_CHANGE_EVENT(element, CE_PLAYER_PRESSES_X) ? CE_PLAYER_PRESSES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_SWITCHES_X) ? CE_PLAYER_SWITCHES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_SNAPS_X) ? CE_PLAYER_SNAPS_X :
      HAS_CHANGE_EVENT(element, CE_PLAYER_PUSHES_X) ? CE_PLAYER_PUSHES_X :
      HAS_CHANGE_EVENT(element, CE_PLAYER_ENTERS_X) ? CE_PLAYER_ENTERS_X :
      HAS_CHANGE_EVENT(element, CE_PLAYER_LEAVES_X) ? CE_PLAYER_LEAVES_X :
@@ -6284,10 +6609,13 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_PLAYER_DROPS_X) ? CE_PLAYER_DROPS_X :
      HAS_CHANGE_EVENT(element, CE_TOUCHING_X) ? CE_TOUCHING_X :
      HAS_CHANGE_EVENT(element, CE_HITTING_X) ? CE_HITTING_X :
+     HAS_CHANGE_EVENT(element, CE_DIGGING_X) ? CE_DIGGING_X :
      HAS_CHANGE_EVENT(element, CE_HIT_BY_X) ? CE_HIT_BY_X :
      HAS_CHANGE_EVENT(element, CE_SWITCH_OF_X) ? CE_SWITCH_OF_X :
      HAS_CHANGE_EVENT(element, CE_CHANGE_OF_X) ? CE_CHANGE_OF_X :
      HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
+     HAS_CHANGE_EVENT(element, CE_MOVE_OF_X) ? CE_MOVE_OF_X :
+     HAS_CHANGE_EVENT(element, CE_CREATION_OF_X) ? CE_CREATION_OF_X :
      HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X :
      custom_element_change.other_action);
 }
@@ -6393,6 +6721,8 @@ static void CopyCustomElementPropertiesToGame(int element)
   /* set player change event from checkbox and selectbox */
   custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_PRESSED_BY_PLAYER] = FALSE;
+  custom_element_change_events[CE_SWITCHED_BY_PLAYER] = FALSE;
+  custom_element_change_events[CE_SNAPPED_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_PUSHED_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_ENTERED_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE;
@@ -6410,6 +6740,8 @@ static void CopyCustomElementPropertiesToGame(int element)
   /* set other element action change event from checkbox and selectbox */
   custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE;
   custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_SWITCHES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_SNAPS_X] = FALSE;
   custom_element_change_events[CE_PLAYER_PUSHES_X] = FALSE;
   custom_element_change_events[CE_PLAYER_ENTERS_X] = FALSE;
   custom_element_change_events[CE_PLAYER_LEAVES_X] = FALSE;
@@ -6418,10 +6750,13 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_PLAYER_DROPS_X] = FALSE;
   custom_element_change_events[CE_TOUCHING_X] = FALSE;
   custom_element_change_events[CE_HITTING_X] = FALSE;
+  custom_element_change_events[CE_DIGGING_X] = FALSE;
   custom_element_change_events[CE_HIT_BY_X] = FALSE;
   custom_element_change_events[CE_SWITCH_OF_X] = FALSE;
   custom_element_change_events[CE_CHANGE_OF_X] = FALSE;
   custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
+  custom_element_change_events[CE_MOVE_OF_X] = FALSE;
+  custom_element_change_events[CE_CREATION_OF_X] = FALSE;
   custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
     custom_element_change_events[CE_BY_OTHER_ACTION];
@@ -6504,6 +6839,7 @@ void DrawLevelEd()
 
   redraw_mask |= REDRAW_ALL;
 
+  ReinitializeElementList();           /* update dynamic level element list */
   ReinitializeElementListButtons();    /* custom element may look different */
 
   UnmapTapeButtons();
@@ -6622,6 +6958,26 @@ static void AdjustEditorScrollbar(int id)
               GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
 }
 
+static void AdjustElementListScrollbar()
+{
+  struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL];
+  int items_max, items_visible, item_position;
+
+  /* correct position of element list scrollbar */
+  if (element_shift < 0)
+    element_shift = 0;
+  if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+    element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+  items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ;
+  items_visible = ED_ELEMENTLIST_BUTTONS_VERT;
+  item_position = element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ;
+
+  ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max,
+              GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
+              GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
+}
+
 static void ModifyEditorCounterValue(int counter_id, int new_value)
 {
   int *counter_value = counterbutton_info[counter_id].value;
@@ -6679,6 +7035,9 @@ static void ModifyEditorDrawingArea(int drawingarea_id, int xsize, int ysize)
   int gadget_id = drawingarea_info[drawingarea_id].gadget_id;
   struct GadgetInfo *gi = level_editor_gadget[gadget_id];
 
+  drawingarea_info[drawingarea_id].area_xsize = xsize;
+  drawingarea_info[drawingarea_id].area_ysize = ysize;
+
   ModifyGadget(gi, GDI_AREA_SIZE, xsize, ysize, GDI_END);
 }
 
@@ -6694,8 +7053,10 @@ static void ModifyEditorElementList()
     int element = editor_elements[element_shift + i];
 
     UnmapGadget(gi);
+
     getMiniGraphicSource(el2edimg(element), &gd->bitmap, &gd->x, &gd->y);
     ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END);
+
     MapGadget(gi);
   }
 }
@@ -6768,10 +7129,15 @@ static void DrawLevelInfoWindow()
   ClearWindow();
   UnmapLevelEditorWindowGadgets();
 
+#if 0
+  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings");
+  DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings");
+#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
 
   /* draw counter gadgets */
   for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
@@ -6870,14 +7236,61 @@ static void DrawMagicBallContentAreas()
   int y = SY + ED_AREA_MAGIC_BALL_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE;
   int i;
 
+  /* display counter to choose number of element content areas */
+  MapCounterButtons(ED_COUNTER_ID_BALL_CONTENT);
+
   for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
-    MapDrawingArea(ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 + i);
+  {
+    int id = ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 + i;
+
+    if (i < level.num_ball_contents)
+    {
+      MapDrawingArea(id);
+    }
+    else
+    {
+      int font_height = getFontHeight(FONT_TEXT_1);
+
+      UnmapDrawingArea(id);
+
+      /* delete content areas in case of reducing number of them */
+      DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2,
+                    SY + drawingarea_info[id].y - MINI_TILEY / 2,
+                    4 * MINI_TILEX,
+                    4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height);
+    }
+  }
 
   DrawText(x, y + 0 * MINI_TILEY, "generated", FONT_TEXT_1);
   DrawText(x, y + 1 * MINI_TILEY, "when",      FONT_TEXT_1);
   DrawText(x, y + 2 * MINI_TILEY, "active",    FONT_TEXT_1);
 }
 
+static void DrawAndroidElementArea(int element)
+{
+  int num_elements = level.num_android_clone_elements;
+  int id = ED_DRAWING_ID_ANDROID_CONTENT;
+  int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2;
+  int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2;
+  int xsize = MAX_ANDROID_ELEMENTS;
+  int ysize = 1;
+
+  /* display counter to choose number of element areas */
+  MapCounterButtons(ED_COUNTER_ID_ANDROID_CONTENT);
+
+  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 DrawGroupElementArea(int element)
 {
   int num_elements = group_element_info.num_elements;
@@ -7075,7 +7488,9 @@ static void DrawPropertiesInfo()
     /* pre-defined properties */
     { EP_CAN_PASS_MAGIC_WALL,  "- can pass magic walls"                },
     { EP_SWITCHABLE,           "- can be switched"                     },
-    { EP_HAS_CONTENT,          "- can contain other elements"          },
+#if 0
+    { EP_HAS_EDITOR_CONTENT,   "- can contain other elements"          },
+#endif
 
     { -1,                      NULL                                    }
   };
@@ -7283,7 +7698,7 @@ static boolean checkPropertiesConfig(int element)
       IS_GROUP_ELEMENT(element) ||
       IS_ENVELOPE(element) ||
       ELEM_IS_PLAYER(element) ||
-      HAS_CONTENT(element) ||
+      HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
       MAYBE_DONT_COLLIDE_WITH(element))
@@ -7317,11 +7732,13 @@ static void DrawPropertiesConfig()
       int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
 
       counterbutton_info[counter_id].y =
-       ED_ELEMENT_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) +
-                        (CAN_GROW(properties_element) ? 1 : 0) +
-                        (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) +
-                        (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0)+
-                        num_element_counters);
+       ED_ELEMENT_SETTINGS_YPOS(
+               (HAS_EDITOR_CONTENT(properties_element)      ? 1 : 0) +
+               (CAN_GROW(properties_element)                ? 1 : 0) +
+               (COULD_MOVE_INTO_ACID(properties_element)    ? 1 : 0) +
+               (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) +
+               (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
+               num_element_counters);
 
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
       counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
@@ -7347,7 +7764,7 @@ static void DrawPropertiesConfig()
     }
   }
 
-  if (HAS_CONTENT(properties_element))
+  if (HAS_EDITOR_CONTENT(properties_element))
   {
     /* draw stickybutton gadget */
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
@@ -7356,22 +7773,36 @@ static void DrawPropertiesConfig()
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
     else if (properties_element == EL_YAMYAM)
       DrawYamYamContentAreas();
-  }
+    else if (properties_element == EL_EMC_MAGIC_BALL)
+    {
+      DrawMagicBallContentAreas();
 
-  if (properties_element == EL_EMC_MAGIC_BALL)
-    DrawMagicBallContentAreas();
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT);
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_BALL_STATE);
+    }
+    else if (properties_element == EL_EMC_ANDROID)
+      DrawAndroidElementArea(properties_element);
+  }
 
   if (ELEM_IS_PLAYER(properties_element))
   {
     int player_nr = GET_PLAYER_NR(properties_element);
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
       &level.start_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
+      &level.artwork_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
+      &level.explosion_element[player_nr];
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
       &level.use_start_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value =
+      &level.use_artwork_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value =
+      &level.use_explosion_element[player_nr];
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
@@ -7380,10 +7811,14 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DOUBLE_SPEED);
 
     MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT);
   }
 
   if (IS_GEM(properties_element))
@@ -7399,7 +7834,7 @@ static void DrawPropertiesConfig()
       ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0);
     checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
       ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
-                      HAS_CONTENT(properties_element) ? 1 : 0);
+                      HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
   }
@@ -7421,7 +7856,7 @@ static void DrawPropertiesConfig()
   if (CAN_GROW(properties_element))
   {
     checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
-      ED_ELEMENT_SETTINGS_YPOS(HAS_CONTENT(properties_element) ? 1 : 0);
+      ED_ELEMENT_SETTINGS_YPOS(HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE);
   }
@@ -7577,7 +8012,18 @@ static void DrawPropertiesChange()
   DrawPropertiesChangeDrawingAreas();
 }
 
-static void DrawElementName(int x, int y, int element)
+static void DrawEditorElementAnimation(int x, int y)
+{
+  int graphic = el2img(properties_element);
+  int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ?
+              custom_element.ce_value_fixed_initial :
+              ANIM_MODE(graphic) == ANIM_CE_SCORE ?
+              custom_element.collect_score_initial : FrameCounter);
+
+  DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+}
+
+static void DrawEditorElementName(int x, int y, int element)
 {
   char *element_name = getElementInfoText(element);
   int font_nr = FONT_TEXT_1;
@@ -7651,21 +8097,37 @@ static void DrawPropertiesWindow()
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
   ClearWindow();
 
+#if 0
+  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
+#else
   DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
           "Element Settings", FONT_TITLE_1);
+#endif
+
+#if 1
+  FrameCounter = 0;    /* restart animation frame counter */
+#endif
 
   DrawElementBorder(SX + xstart * MINI_TILEX,
                    SY + ystart * MINI_TILEY + MINI_TILEY / 2,
                    TILEX, TILEY, FALSE);
+#if 1
+  DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
+                            SY + ystart * MINI_TILEY + MINI_TILEY / 2);
+#else
   DrawGraphicAnimationExt(drawto,
                          SX + xstart * MINI_TILEX,
                          SY + ystart * MINI_TILEY + MINI_TILEY / 2,
                          el2img(properties_element), -1, NO_MASKING);
+#endif
 
+#if 0
   FrameCounter = 0;    /* restart animation frame counter */
+#endif
 
-  DrawElementName((xstart + 3) * MINI_TILEX + 1, (ystart + 1) * MINI_TILEY + 1,
-                 properties_element);
+  DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
+                       (ystart + 1) * MINI_TILEY + 1,
+                       properties_element);
 
   DrawPropertiesTabulatorGadgets();
 
@@ -8656,6 +9118,14 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
       DrawYamYamContentAreas();
       break;
 
+    case ED_COUNTER_ID_BALL_CONTENT:
+      DrawMagicBallContentAreas();
+      break;
+
+    case ED_COUNTER_ID_ANDROID_CONTENT:
+      DrawAndroidElementArea(properties_element);
+      break;
+
     case ED_COUNTER_ID_GROUP_CONTENT:
       DrawGroupElementArea(properties_element);
       CopyGroupElementPropertiesToGame(properties_element);
@@ -8732,11 +9202,15 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
   {
     if (type_id == ED_SELECTBOX_ID_ACTION_TYPE)
     {
-      /* when changing action type, reset action mode and action arg */
+      /* when changing action type, also check action mode and action arg */
       if (value_old != value_new)
       {
+#if 1
+       setSelectboxSpecialActionVariablesIfNeeded();
+#else
        custom_element_change.action_mode = -1;
        custom_element_change.action_arg = -1;
+#endif
       }
 
       DrawPropertiesChange();
@@ -9242,6 +9716,37 @@ static void HandleControlButtons(struct GadgetInfo *gi)
        int element_position = id - GADGET_ID_ELEMENTLIST_FIRST;
        int new_element = editor_elements[element_position + element_shift];
 
+       if (IS_EDITOR_CASCADE(new_element))
+       {
+         int i;
+
+         for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+         {
+           int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
+           boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
+
+           if (*cascade_element == new_element)
+           {
+             *cascade_element = EL_CASCADE_TOGGLE(*cascade_element);
+             *cascade_value = IS_EDITOR_CASCADE_ACTIVE(*cascade_element);
+
+             /* update element selection list */
+             ReinitializeElementList();
+             ModifyEditorElementList();
+
+             /* update cascading gadget info text */
+             PrintEditorGadgetInfoText(level_editor_gadget[id]);
+
+             /* save current editor cascading state */
+             SaveSetup_EditorCascade();
+
+             break;
+           }
+         }
+
+         break;
+       }
+
        if (last_custom_copy_mode != -1)
        {
          if (CopyCustomElement(properties_element, new_element,
@@ -9379,10 +9884,15 @@ void HandleLevelEditorIdle()
   if (!DelayReached(&action_delay, action_delay_value))
     return;
 
+#if 1
+  DrawEditorElementAnimation(SX + xpos * TILEX,
+                            SY + ypos * TILEY + MINI_TILEY / 2);
+#else
   DrawGraphicAnimationExt(drawto,
                          SX + xpos * TILEX,
                          SY + ypos * TILEY + MINI_TILEY / 2,
                          el2img(properties_element), -1, NO_MASKING);
+#endif
 
   MarkTileDirty(xpos, ypos);
   MarkTileDirty(xpos, ypos + 1);
@@ -9395,25 +9905,66 @@ void ClearEditorGadgetInfoText()
   DrawBackground(INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE);
 }
 
+void PrintEditorGadgetInfoText(struct GadgetInfo *gi)
+{
+  char infotext[MAX_OUTPUT_LINESIZE + 1];
+  char shortcut[MAX_OUTPUT_LINESIZE + 1];
+  int max_infotext_len = getMaxInfoTextLength();
+
+  if (gi == NULL || gi->info_text == NULL)
+    return;
+
+  strncpy(infotext, gi->info_text, max_infotext_len);
+  infotext[max_infotext_len] = '\0';
+
+  if (gi->custom_id < ED_NUM_CTRL_BUTTONS)
+  {
+    int key = control_info[gi->custom_id].shortcut;
+
+    if (key)
+    {
+      if (gi->custom_id == GADGET_ID_SINGLE_ITEMS)     /* special case 1 */
+       sprintf(shortcut, " ('.' or '%c')", key);
+      else if (gi->custom_id == GADGET_ID_PICK_ELEMENT)        /* special case 2 */
+       sprintf(shortcut, " ('%c' or 'Ctrl')", key);
+      else if (gi->custom_id == GADGET_ID_TEST)                /* special case 3 */
+       sprintf(shortcut, " ('Enter' or 'Shift-%c')", key);
+      else                                             /* normal case */
+       sprintf(shortcut, " ('%s%c')",
+               (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key);
+
+      if (strlen(infotext) + strlen(shortcut) <= max_infotext_len)
+       strcat(infotext, shortcut);
+    }
+  }
+
+  DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
+}
+
 void HandleEditorGadgetInfoText(void *ptr)
 {
   struct GadgetInfo *gi = (struct GadgetInfo *)ptr;
+#if 0
   char infotext[MAX_OUTPUT_LINESIZE + 1];
   char shortcut[MAX_OUTPUT_LINESIZE + 1];
   int max_infotext_len = getMaxInfoTextLength();
+#endif
 
   if (game_status != GAME_MODE_EDITOR)
     return;
 
   ClearEditorGadgetInfoText();
 
-  if (gi->event.type == GD_EVENT_INFO_LEAVING)
+  if (gi == NULL || gi->event.type == GD_EVENT_INFO_LEAVING)
     return;
 
   /* misuse this function to delete brush cursor, if needed */
   if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
     DeleteBrushFromCursor();
 
+#if 1
+  PrintEditorGadgetInfoText(gi);
+#else
   if (gi == NULL || gi->info_text == NULL)
     return;
 
@@ -9442,6 +9993,7 @@ void HandleEditorGadgetInfoText(void *ptr)
   }
 
   DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
+#endif
 }
 
 static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
@@ -9586,6 +10138,8 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
             id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
       sprintf(infotext, "content area %d position: %d, %d",
              id - GADGET_ID_MAGIC_BALL_CONTENT_0 + 1, sx, sy);
+    else if (id == GADGET_ID_ANDROID_CONTENT)
+      sprintf(infotext, "android element position: %d", sx + 1);
     else if (drawingarea_info[type_id].infotext != NULL)
       strcpy(infotext, drawingarea_info[type_id].infotext);
   }