rnd-20051229-1-src
[rocksndiamonds.git] / src / editor.c
index 86413d2724ea8173f8264a8876185831b97279a3..4852f3e3de182ddb7d88c1a139b95d04b09bf0b0 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 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_ENVELOPE_XSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 39)
+#define GADGET_ID_ENVELOPE_XSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 40)
+#define GADGET_ID_ENVELOPE_XSIZE_UP    (GADGET_ID_COUNTER_FIRST + 41)
+#define GADGET_ID_ENVELOPE_YSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 42)
+#define GADGET_ID_ENVELOPE_YSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 43)
+#define GADGET_ID_ENVELOPE_YSIZE_UP    (GADGET_ID_COUNTER_FIRST + 44)
+#define GADGET_ID_CUSTOM_SCORE_DOWN    (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_CUSTOM_SCORE_TEXT    (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_CUSTOM_SCORE_UP      (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_CUSTOM_GEMCOUNT_UP   (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_CUSTOM_VALUE_FIX_UP  (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_CUSTOM_VALUE_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_CUSTOM_VALUE_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_CUSTOM_VALUE_RND_UP  (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_PUSH_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_PUSH_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_PUSH_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_PUSH_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_PUSH_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_PUSH_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_DROP_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_DROP_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_DROP_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_DROP_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_DROP_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_DROP_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 70)
+#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 71)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 72)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 73)
+#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 74)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 75)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 76)
+#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 77)
+#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 78)
+#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 79)
+#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 80)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 81)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 82)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 83)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 84)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 85)
+#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 86)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 87)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 88)
+#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 89)
+#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 91)
+#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 92)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 93)
 
 #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_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_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 18)
-#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 19)
-#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 20)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#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)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 28)
 
 #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_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#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_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 45)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 46)
 #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_ENVELOPE_XSIZE   13
+#define ED_COUNTER_ID_ENVELOPE_YSIZE   14
+#define ED_COUNTER_ID_CUSTOM_SCORE     15
+#define ED_COUNTER_ID_CUSTOM_GEMCOUNT  16
+#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 17
+#define ED_COUNTER_ID_CUSTOM_VALUE_RND 18
+#define ED_COUNTER_ID_PUSH_DELAY_FIX   19
+#define ED_COUNTER_ID_PUSH_DELAY_RND   20
+#define ED_COUNTER_ID_DROP_DELAY_FIX   21
+#define ED_COUNTER_ID_DROP_DELAY_RND   22
+#define ED_COUNTER_ID_MOVE_DELAY_FIX   23
+#define ED_COUNTER_ID_MOVE_DELAY_RND   24
+#define ED_COUNTER_ID_EXPLOSION_DELAY  25
+#define ED_COUNTER_ID_IGNITION_DELAY   26
+#define ED_COUNTER_ID_GROUP_CONTENT    27
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 28
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 29
+#define ED_COUNTER_ID_CHANGE_CONT_RND  30
+
+#define ED_NUM_COUNTERBUTTONS          31
 
 #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_CAN_PASS_TO_WALKABLE 12
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   13
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   14
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    15
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   16
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  17
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    18
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        19
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        20
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        21
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        22
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      23
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      24
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     25
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      26
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   28
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  29
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 30
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        31
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    32
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         33
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 34
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  35
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 36
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   37
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 38
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    39
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    40
-
-#define ED_NUM_CHECKBUTTONS                    41
+#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_CAN_PASS_TO_WALKABLE 15
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   16
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   17
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    18
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   19
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  20
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    21
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        22
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        23
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        24
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        25
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      26
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      27
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     28
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      29
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                30
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   31
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  32
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 33
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        34
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    35
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         36
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 37
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  38
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 39
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   40
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 41
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    42
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    43
+
+#define ED_NUM_CHECKBUTTONS                    44
 
 #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_6     15
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7     16
 #define ED_DRAWING_ID_AMOEBA_CONTENT           17
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC           18
-#define ED_DRAWING_ID_CUSTOM_CONTENT           19
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                20
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                21
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     22
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    23
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    24
-#define ED_DRAWING_ID_GROUP_CONTENT            25
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                26
+#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                   27
+#define ED_NUM_DRAWING_AREAS                   28
 
 
 /*
@@ -1019,7 +1031,7 @@ static struct
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
     GADGET_ID_LEVEL_TIMESCORE_TEXT,    GADGET_ID_NONE,
     &level.score[SC_TIME_BONUS],
-    "score for each 10 sec/steps left:", NULL, NULL
+    "score for each second/step left:",        NULL, NULL
   },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_COUNTER2_YPOS(8),
@@ -1072,6 +1084,14 @@ 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(0),
     MIN_ENVELOPE_XSIZE,                        MAX_ENVELOPE_XSIZE,
@@ -1478,6 +1498,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"                },
@@ -1499,6 +1521,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,6 +1535,7 @@ static struct ValueTextInfo options_change_other_action[] =
   { 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_VALUE_GETS_ZERO_OF_X,   "CE value gets 0 of"            },
 
   { -1,                                NULL                            }
@@ -1594,25 +1619,28 @@ static struct ValueTextInfo options_change_replace_when[] =
 static struct ValueTextInfo options_action_type[] =
 {
   { CA_NO_ACTION,              "no action"                     },
-  { CA_EXIT_PLAYER,            "exit player"                   },
-  { CA_KILL_PLAYER,            "kill player"                   },
-  { CA_MOVE_PLAYER,            "move player"                   },
+  { CA_UNDEFINED,              " "                             },
+  { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]"               },
   { CA_RESTART_LEVEL,          "restart level"                 },
   { CA_SHOW_ENVELOPE,          "show envelope"                 },
-  { CA_SET_TIME,               "set level time"                },
-  { CA_SET_GEMS,               "set needed gems"               },
-  { CA_SET_SCORE,              "set level score"               },
-  { CA_SET_KEYS,               "set player keys"               },
-  { CA_SET_SPEED,              "set player speed"              },
-  { CA_SET_GRAVITY,            "set gravity"                   },
-  { CA_SET_WIND,               "set wind dir."                 },
+  { CA_SET_LEVEL_TIME,         "set time"                      },
+  { CA_SET_LEVEL_SCORE,                "set score"                     },
+  { CA_SET_LEVEL_GEMS,         "set needed gems"               },
+  { CA_SET_LEVEL_GRAVITY,      "set gravity"                   },
+  { CA_SET_LEVEL_WIND,         "set wind dir."                 },
+  { CA_UNDEFINED,              " "                             },
+  { CA_HEADLINE_PLAYER_ACTIONS,        "[player actions]"              },
+  { CA_MOVE_PLAYER,            "move player"                   },
+  { CA_EXIT_PLAYER,            "exit player"                   },
+  { CA_KILL_PLAYER,            "kill player"                   },
+  { CA_SET_PLAYER_KEYS,                "set keys"                      },
+  { CA_SET_PLAYER_SPEED,       "set speed"                     },
+  { CA_SET_PLAYER_SHIELD,      "set shield"                    },
+  { CA_SET_PLAYER_ARTWORK,     "set artwork"                   },
+  { CA_UNDEFINED,              " "                             },
+  { CA_HEADLINE_CE_ACTIONS,    "[CE actions]"                  },
   { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_SET_CE_VALUE,           "set CE value"                  },
-#if 0
-  { CA_SET_DYNABOMB_NUMBER,    "set bomb number"               },
-  { CA_SET_DYNABOMB_SIZE,      "set bomb size"                 },
-  { CA_SET_DYNABOMB_POWER,     "set bomb power"                },
-#endif
 
   { -1,                                NULL                            }
 };
@@ -1693,6 +1721,10 @@ static struct ValueTextInfo options_action_arg_number[] =
   { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
   { CA_ARG_NUMBER_CE_VALUE,    "CE value"                      },
   { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_NUMBER_LEVEL_TIME,  "time"                          },
+  { CA_ARG_NUMBER_LEVEL_GEMS,  "gems"                          },
+  { CA_ARG_NUMBER_LEVEL_SCORE, "score"                         },
+  { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_HEADLINE,   "[CE value"                     },
   { CA_ARG_ELEMENT_HEADLINE,   " of"                           },
   { CA_ARG_ELEMENT_HEADLINE,   " element]"                     },
@@ -1702,17 +1734,13 @@ static struct ValueTextInfo options_action_arg_number[] =
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_action_arg_key[] =
+static struct ValueTextInfo options_action_arg_envelope[] =
 {
   { CA_ARG_NUMBER_HEADLINE,    "[number]"                      },
   { CA_ARG_1,                  "1"                             },
   { CA_ARG_2,                  "2"                             },
   { CA_ARG_3,                  "3"                             },
   { CA_ARG_4,                  "4"                             },
-  { CA_ARG_5,                  "5"                             },
-  { CA_ARG_6,                  "6"                             },
-  { CA_ARG_7,                  "7"                             },
-  { CA_ARG_8,                  "8"                             },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
@@ -1721,13 +1749,17 @@ static struct ValueTextInfo options_action_arg_key[] =
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_action_arg_envelope[] =
+static struct ValueTextInfo options_action_arg_key[] =
 {
   { CA_ARG_NUMBER_HEADLINE,    "[number]"                      },
   { CA_ARG_1,                  "1"                             },
   { CA_ARG_2,                  "2"                             },
   { CA_ARG_3,                  "3"                             },
   { CA_ARG_4,                  "4"                             },
+  { CA_ARG_5,                  "5"                             },
+  { CA_ARG_6,                  "6"                             },
+  { CA_ARG_7,                  "7"                             },
+  { CA_ARG_8,                  "8"                             },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
@@ -1755,6 +1787,27 @@ static struct ValueTextInfo options_action_arg_speed[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_action_arg_shield[] =
+{
+  { CA_ARG_SHIELD_HEADLINE,    "[shield]"                      },
+  { CA_ARG_SHIELD_OFF,         "off"                           },
+  { CA_ARG_SHIELD_NORMAL,      "normal"                        },
+  { CA_ARG_SHIELD_DEADLY,      "deadly"                        },
+
+  { -1,                                NULL                            }
+};
+
+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                            }
+};
+
 static struct ValueTextInfo options_action_arg_gravity[] =
 {
   { CA_ARG_GRAVITY_HEADLINE,   "[gravity]"                     },
@@ -1818,13 +1871,15 @@ action_arg_options[] =
   { CA_MOVE_PLAYER,            0,      options_action_arg_direction,   },
   { CA_RESTART_LEVEL,          0,      options_action_arg_none,        },
   { CA_SHOW_ENVELOPE,          0,      options_action_arg_envelope,    },
-  { CA_SET_TIME,               3,      options_action_arg_number,      },
-  { CA_SET_GEMS,               3,      options_action_arg_number,      },
-  { CA_SET_SCORE,              3,      options_action_arg_number,      },
-  { CA_SET_KEYS,               2,      options_action_arg_key,         },
-  { CA_SET_SPEED,              1,      options_action_arg_speed,       },
-  { CA_SET_GRAVITY,            1,      options_action_arg_gravity,     },
-  { CA_SET_WIND,               1,      options_action_arg_direction,   },
+  { CA_SET_LEVEL_TIME,         3,      options_action_arg_number,      },
+  { CA_SET_LEVEL_GEMS,         3,      options_action_arg_number,      },
+  { CA_SET_LEVEL_SCORE,                3,      options_action_arg_number,      },
+  { CA_SET_LEVEL_GRAVITY,      1,      options_action_arg_gravity,     },
+  { CA_SET_LEVEL_WIND,         1,      options_action_arg_direction,   },
+  { CA_SET_PLAYER_KEYS,                2,      options_action_arg_key,         },
+  { CA_SET_PLAYER_SPEED,       1,      options_action_arg_speed,       },
+  { CA_SET_PLAYER_SHIELD,      1,      options_action_arg_shield,      },
+  { CA_SET_PLAYER_ARTWORK,     1,      options_action_arg_artwork,     },
   { CA_SET_CE_SCORE,           3,      options_action_arg_number,      },
   { CA_SET_CE_VALUE,           3,      options_action_arg_number,      },
 
@@ -2349,6 +2404,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,
@@ -2368,7 +2437,7 @@ static struct
     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),
@@ -2391,6 +2460,13 @@ static struct
     NULL,
     "no scrolling when relocating",    "player gets relocated without delay"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    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),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
@@ -2589,130 +2665,140 @@ static struct
 static struct
 {
   int x, y;
-  int area_xsize, area_ysize;
   int gadget_id;
   int gadget_id_align;
-  char *text_left, *text_right, *text_below;
+  int *value;
+  int area_xsize, area_ysize;
+  char *text_left, *text_right, *text_below, *infotext;
 } drawingarea_info[ED_NUM_DRAWING_AREAS] =
 {
   /* ---------- level playfield content ------------------------------------ */
 
   {
-    0, 0,
-    MAX_ED_FIELDX, MAX_ED_FIELDY,
+    0,                                 0,
     GADGET_ID_DRAWING_LEVEL,           GADGET_ID_NONE,
-    NULL, NULL,                                NULL
+    NULL,                              MAX_ED_FIELDX, MAX_ED_FIELDY,
+    NULL, NULL, NULL,                  NULL
   },
 
   /* ---------- yam yam content -------------------------------------------- */
 
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(0),    ED_AREA_YAMYAM_CONTENT_YPOS(0),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_0,                GADGET_ID_NONE,
-    NULL, NULL,                                "1"
+    &level.yamyam_content[0].e[0][0],  3, 3,
+    NULL, NULL, "1",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(1),    ED_AREA_YAMYAM_CONTENT_YPOS(1),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_1,                GADGET_ID_NONE,
-    NULL, NULL,                                "2"
+    &level.yamyam_content[1].e[0][0],  3, 3,
+    NULL, NULL, "2",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(2),    ED_AREA_YAMYAM_CONTENT_YPOS(2),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_2,                GADGET_ID_NONE,
-    NULL, NULL,                                "3"
+    &level.yamyam_content[2].e[0][0],  3, 3,
+    NULL, NULL, "3",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(3),    ED_AREA_YAMYAM_CONTENT_YPOS(3),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_3,                GADGET_ID_NONE,
-    NULL, NULL,                                "4"
+    &level.yamyam_content[3].e[0][0],  3, 3,
+    NULL, NULL, "4",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(4),    ED_AREA_YAMYAM_CONTENT_YPOS(4),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_4,                GADGET_ID_NONE,
-    NULL, NULL,                                "5"
+    &level.yamyam_content[4].e[0][0],  3, 3,
+    NULL, NULL, "5",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(5),    ED_AREA_YAMYAM_CONTENT_YPOS(5),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_5,                GADGET_ID_NONE,
-    NULL, NULL,                                "6"
+    &level.yamyam_content[5].e[0][0],  3, 3,
+    NULL, NULL, "6",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(6),    ED_AREA_YAMYAM_CONTENT_YPOS(6),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_6,                GADGET_ID_NONE,
-    NULL, NULL,                                "7"
+    &level.yamyam_content[6].e[0][0],  3, 3,
+    NULL, NULL, "7",                   NULL
   },
   {
     ED_AREA_YAMYAM_CONTENT_XPOS(7),    ED_AREA_YAMYAM_CONTENT_YPOS(7),
-    3, 3,
     GADGET_ID_YAMYAM_CONTENT_7,                GADGET_ID_NONE,
-    NULL, NULL,                                "8"
+    &level.yamyam_content[7].e[0][0],  3, 3,
+    NULL, NULL, "8",                   NULL
   },
 
   /* ---------- magic ball content ----------------------------------------- */
 
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(0),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(0),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_0,    GADGET_ID_NONE,
-    NULL, NULL,                                "1"
+    &level.ball_content[0].e[0][0],    3, 3,
+    NULL, NULL, "1",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(1),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(1),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_1,    GADGET_ID_NONE,
-    NULL, NULL,                                "2"
+    &level.ball_content[1].e[0][0],    3, 3,
+    NULL, NULL, "2",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(2),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(2),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_2,    GADGET_ID_NONE,
-    NULL, NULL,                                "3"
+    &level.ball_content[2].e[0][0],    3, 3,
+    NULL, NULL, "3",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(3),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(3),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_3,    GADGET_ID_NONE,
-    NULL, NULL,                                "4"
+    &level.ball_content[3].e[0][0],    3, 3,
+    NULL, NULL, "4",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(4),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(4),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_4,    GADGET_ID_NONE,
-    NULL, NULL,                                "5"
+    &level.ball_content[4].e[0][0],    3, 3,
+    NULL, NULL, "5",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(5),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(5),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_5,    GADGET_ID_NONE,
-    NULL, NULL,                                "6"
+    &level.ball_content[5].e[0][0],    3, 3,
+    NULL, NULL, "6",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(6),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(6),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_6,    GADGET_ID_NONE,
-    NULL, NULL,                                "7"
+    &level.ball_content[6].e[0][0],    3, 3,
+    NULL, NULL, "7",                   NULL
   },
   {
     ED_AREA_MAGIC_BALL_CONTENT_XPOS(7),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(7),
-    3, 3,
     GADGET_ID_MAGIC_BALL_CONTENT_7,    GADGET_ID_NONE,
-    NULL, NULL,                                "8"
+    &level.ball_content[7].e[0][0],    3, 3,
+    NULL, NULL, "8",                   NULL
   },
 
   /* ---------- amoeba content --------------------------------------------- */
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(3),
-    1, 1,
     GADGET_ID_AMOEBA_CONTENT,          GADGET_ID_NONE,
-    "content:", NULL,                  NULL
+    &level.amoeba_content,             1, 1,
+    "content:", NULL, NULL,            "amoeba content"
+  },
+
+  /* ---------- level start element ---------------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(6),
+    GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
+    &level.start_element[0],           1, 1,
+    NULL, NULL, NULL,                  "level start element"
   },
 
   /* ---------- element settings: configure 1 (custom elements) ----------- */
@@ -2721,9 +2807,9 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
-    1, 1,
     GADGET_ID_CUSTOM_GRAPHIC,          GADGET_ID_CUSTOM_USE_GRAPHIC,
-    NULL, NULL,                                NULL
+    &custom_element.gfx_element,       1, 1,
+    NULL, NULL, NULL,                  "custom graphic element"
   },
 
   /* ---------- element settings: configure 2 (custom elements) ----------- */
@@ -2732,24 +2818,24 @@ static struct
 
   {
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(10),
-    3, 3,
     GADGET_ID_CUSTOM_CONTENT,          GADGET_ID_NONE, /* align three rows */
-    "content:", NULL,                  NULL
+    &custom_element.content.e[0][0],   3, 3,
+    "content:", NULL, NULL,            NULL
   },
 
   /* ---------- custom enter and leave element (when moving) --------------- */
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(1),      ED_AREA_1X1_SETTINGS_YPOS(3),
-    1, 1,
     GADGET_ID_CUSTOM_MOVE_ENTER,       GADGET_ID_NONE,
-    "can dig:", " ",                   NULL
+    &custom_element.move_enter_element,        1, 1,
+    "can dig:", " ", NULL,             "element that can be digged/collected"
   },
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(3),
-    1, 1,
     GADGET_ID_CUSTOM_MOVE_LEAVE,       GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
-    NULL, NULL,                                NULL
+    &custom_element.move_leave_element,        1, 1,
+    NULL, NULL, NULL,                  "element that will be left behind"
   },
 
   /* ---------- element settings: advanced (custom elements) --------------- */
@@ -2758,45 +2844,45 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
-    1, 1,
     GADGET_ID_CUSTOM_CHANGE_TARGET,    GADGET_ID_CUSTOM_CAN_CHANGE,
-    NULL, "after/when:",               NULL
+    &custom_element_change.target_element, 1, 1,
+    NULL, "after/when:", NULL,         "new target element after change"
   },
 
   /* ---------- custom change content (extended change target) ------------- */
 
   {
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(10),
-    3, 3,
     GADGET_ID_CUSTOM_CHANGE_CONTENT,   GADGET_ID_NONE, /* align three rows */
-    NULL, NULL,                                NULL
+    &custom_element_change.target_content.e[0][0], 3, 3,
+    NULL, NULL, NULL,                  "new extended elements after change"
   },
 
   /* ---------- custom change trigger (element causing change) ------------- */
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(5),
-    1, 1,
     GADGET_ID_CUSTOM_CHANGE_TRIGGER,   GADGET_ID_CHANGE_OTHER_ACTION,
-    NULL, NULL,                                NULL
+    &custom_element_change.trigger_element, 1, 1,
+    NULL, NULL, NULL,                  "other element triggering change"
   },
 
   /* ---------- group element content -------------------------------------- */
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(4),
-    MAX_ELEMENTS_IN_GROUP, 1,
     GADGET_ID_GROUP_CONTENT,           GADGET_ID_NONE,
-    "content:", NULL,                  NULL
+    &group_element_info.element[0],    MAX_ELEMENTS_IN_GROUP, 1,
+    "content:", NULL, NULL,            NULL
   },
 
   /* ---------- random background (for random painting) -------------------- */
 
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
-    1, 1,
     GADGET_ID_RANDOM_BACKGROUND,       GADGET_ID_RANDOM_RESTRICTED,
-    NULL, NULL,                                NULL
+    &random_placement_background_element, 1, 1,
+    NULL, NULL, NULL,                  "random placement background"
   },
 };
 
@@ -3135,7 +3221,13 @@ static int editor_el_emerald_mine_club[] =
 #if RELEASE_3_1_2
   EL_EMPTY,
 #else
+
+#if 0
   EL_EMC_DRIPPER,
+#else
+  EL_EMPTY,
+#endif
+
 #endif
   EL_EMC_FAKE_GRASS,
   EL_EMPTY,
@@ -4403,64 +4495,16 @@ static void DrawDrawingArea(int id)
   struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
   int x, y;
 
-  if (id == ED_DRAWING_ID_RANDOM_BACKGROUND)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(random_placement_background_element));
-  else if (id == ED_DRAWING_ID_AMOEBA_CONTENT)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(level.amoeba_content));
-  else if (id == ED_DRAWING_ID_CUSTOM_GRAPHIC)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(custom_element.gfx_element));
-  else if (id == ED_DRAWING_ID_CUSTOM_CONTENT)
-    for (y = 0; y < 3; y++)
-      for (x = 0; x < 3; x++)
-       DrawMiniGraphicExt(drawto,
-                          gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
-                          el2edimg(custom_element.content.e[x][y]));
-  else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(custom_element.move_enter_element));
-  else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(custom_element.move_leave_element));
-  else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(custom_element_change.target_element));
-  else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT)
-    for (y = 0; y < 3; y++)
-      for (x = 0; x < 3; x++)
-       DrawMiniGraphicExt(drawto,
-                          gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
-                          el2edimg(custom_element_change.target_content.e[x][y]));
-  else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER)
-    DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                      el2edimg(custom_element_change.trigger_element));
-  else if (id == ED_DRAWING_ID_GROUP_CONTENT)
-    for (x = 0; x < group_element_info.num_elements; x++)
-      DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y,
-                        el2edimg(group_element_info.element[x]));
-  else if (id >= ED_DRAWING_ID_YAMYAM_CONTENT_0 &&
-          id <= ED_DRAWING_ID_YAMYAM_CONTENT_7)
-  {
-    int nr = id - ED_DRAWING_ID_YAMYAM_CONTENT_0;
+  int *value = drawingarea_info[id].value;
+  int area_xsize = drawingarea_info[id].area_xsize;
+  int area_ysize = drawingarea_info[id].area_ysize;
 
-    for (y = 0; y < 3; y++)
-      for (x = 0; x < 3; x++)
-       DrawMiniGraphicExt(drawto,
-                          gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
-                          el2edimg(level.yamyam_content[nr].e[x][y]));
-  }
-  else if (id >= ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 &&
-          id <= ED_DRAWING_ID_MAGIC_BALL_CONTENT_7)
-  {
-    int nr = id - ED_DRAWING_ID_MAGIC_BALL_CONTENT_0;
-
-    for (y = 0; y < 3; y++)
-      for (x = 0; x < 3; x++)
-       DrawMiniGraphicExt(drawto,
-                          gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
-                          el2edimg(level.ball_content[nr].e[x][y]));
-  }
+  for (x = 0; x < area_xsize; x++)
+    for (y = 0; y < area_ysize; y++)
+      DrawMiniGraphicExt(drawto,
+                        gi->x + x * MINI_TILEX,
+                        gi->y + y * MINI_TILEY,
+                        el2edimg(value[x * area_ysize + y]));
 }
 
 static void ScrollMiniLevel(int from_x, int from_y, int scroll)
@@ -5564,9 +5608,8 @@ static void MapControlButtons()
 
   /* map buttons to select level */
   counter_id = ED_COUNTER_ID_SELECT_LEVEL;
-  ModifyEditorCounterLimits(counter_id,
-                           leveldir_current->first_level,
-                           leveldir_current->last_level);
+  counterbutton_info[counter_id].min_value = leveldir_current->first_level;
+  counterbutton_info[counter_id].max_value = leveldir_current->last_level;
   MapCounterButtons(counter_id);
 }
 
@@ -6259,6 +6302,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 +6321,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 :
@@ -6288,6 +6335,7 @@ static void CopyCustomElementPropertiesToEditor(int element)
      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_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X :
      custom_element_change.other_action);
 }
@@ -6393,6 +6441,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 +6460,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;
@@ -6422,6 +6474,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   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_VALUE_GETS_ZERO_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
     custom_element_change_events[CE_BY_OTHER_ACTION];
@@ -6679,6 +6732,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);
 }
 
@@ -6870,8 +6926,30 @@ 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);
@@ -7222,7 +7300,7 @@ static struct
   { EL_DYNABOMB_INCREASE_POWER,        &level.score[SC_DYNAMITE],TEXT_COLLECTING },
   { EL_SHIELD_NORMAL,  &level.score[SC_SHIELD],        TEXT_COLLECTING },
   { EL_SHIELD_DEADLY,  &level.score[SC_SHIELD],        TEXT_COLLECTING },
-  { EL_EXTRA_TIME,     &level.score[SC_TIME_BONUS],    TEXT_COLLECTING },
+  { EL_EXTRA_TIME,     &level.extra_time_score,        TEXT_COLLECTING },
   { EL_KEY_1,          &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_KEY_2,          &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_KEY_3,          &level.score[SC_KEY],           TEXT_COLLECTING },
@@ -7321,6 +7399,7 @@ static void DrawPropertiesConfig()
                         (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;
@@ -7356,21 +7435,38 @@ 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);
+    }
+  }
 
   if (ELEM_IS_PLAYER(properties_element))
   {
+    int player_nr = GET_PLAYER_NR(properties_element);
+
+    /* this property can be set for every player individually */
+    drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
+      &level.start_element[player_nr];
+
+    /* this property can be set for every player individually */
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
+      &level.use_start_element[player_nr];
+
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
                         ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
                         ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DOUBLE_SPEED);
+
+    MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
   }
 
   if (IS_GEM(properties_element))
@@ -8454,6 +8550,9 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       }
       else
       {
+       int type_id = gi->custom_type_id;
+       int pos = sx * drawingarea_info[type_id].area_ysize + sy;
+
        if (item_xsize == MINI_TILEX && item_ysize == MINI_TILEY)
          DrawMiniGraphicExt(drawto,
                             gi->x + sx * MINI_TILEX,
@@ -8465,71 +8564,19 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
                         gi->y + sy * TILEY,
                         el2img(new_element), 0);
 
-       if (id == GADGET_ID_AMOEBA_CONTENT)
-         level.amoeba_content = new_element;
-       else if (id == GADGET_ID_CUSTOM_GRAPHIC)
-       {
+       if (id == GADGET_ID_CUSTOM_GRAPHIC)
          new_element = GFX_ELEMENT(new_element);
-         custom_element.gfx_element = new_element;
 
-         CopyElementPropertiesToGame(properties_element);
+       drawingarea_info[type_id].value[pos] = new_element;
 
-         UpdateCustomElementGraphicGadgets();
-
-         FrameCounter = 0;     /* restart animation frame counter */
-       }
-       else if (id == GADGET_ID_CUSTOM_CONTENT)
-       {
-         custom_element.content.e[sx][sy] = new_element;
-
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
-       {
-         custom_element.move_enter_element = new_element;
-
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
-       {
-         custom_element.move_leave_element = new_element;
-
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
-       {
-         custom_element_change.target_element = new_element;
+       CopyElementPropertiesToGame(properties_element);
 
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-       {
-         custom_element_change.target_content.e[sx][sy] = new_element;
-
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
+       if (id == GADGET_ID_CUSTOM_GRAPHIC)
        {
-         custom_element_change.trigger_element = new_element;
-
-         CopyCustomElementPropertiesToGame(properties_element);
-       }
-       else if (id == GADGET_ID_GROUP_CONTENT)
-       {
-         group_element_info.element[sx] = new_element;
+         UpdateCustomElementGraphicGadgets();
 
-         CopyGroupElementPropertiesToGame(properties_element);
+         FrameCounter = 0;     /* restart animation frame counter */
        }
-       else if (id == GADGET_ID_RANDOM_BACKGROUND)
-         random_placement_background_element = new_element;
-       else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
-                id <= GADGET_ID_YAMYAM_CONTENT_7)
-         level.yamyam_content[id - GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy] =
-           new_element;
-       else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
-                id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
-         level.ball_content[id - GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy] =
-           new_element;
       }
       break;
 
@@ -8628,39 +8675,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
                      MB_LEFTBUTTON);
       else if (draw_level)
        PickDrawingElement(button, Feld[lx][ly]);
-      else if (id == GADGET_ID_AMOEBA_CONTENT)
-       PickDrawingElement(button, level.amoeba_content);
-      else if (id == GADGET_ID_CUSTOM_GRAPHIC)
-       PickDrawingElement(button, custom_element.gfx_element);
-      else if (id == GADGET_ID_CUSTOM_CONTENT)
-       PickDrawingElement(button, custom_element.content.e[sx][sy]);
-      else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
-       PickDrawingElement(button, custom_element.move_enter_element);
-      else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
-       PickDrawingElement(button, custom_element.move_leave_element);
-      else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
-       PickDrawingElement(button, custom_element_change.target_element);
-      else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-       PickDrawingElement(button, custom_element_change.target_content.e[sx][sy]);
-      else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
-       PickDrawingElement(button, custom_element_change.trigger_element);
-      else if (id == GADGET_ID_GROUP_CONTENT)
-       PickDrawingElement(button, group_element_info.element[sx]);
-      else if (id == GADGET_ID_RANDOM_BACKGROUND)
-       PickDrawingElement(button, random_placement_background_element);
-      else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
-              id <= GADGET_ID_YAMYAM_CONTENT_7)
-      {
-       int i = id - GADGET_ID_YAMYAM_CONTENT_0;
-
-       PickDrawingElement(button, level.yamyam_content[i].e[sx][sy]);
-      }
-      else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
-              id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
+      else
       {
-       int i = id - GADGET_ID_MAGIC_BALL_CONTENT_0;
+       int type_id = gi->custom_type_id;
+       int pos = sx * drawingarea_info[type_id].area_ysize + sy;
 
-       PickDrawingElement(button, level.ball_content[i].e[sx][sy]);
+       PickDrawingElement(button, drawingarea_info[type_id].value[pos]);
       }
 
       break;
@@ -8719,6 +8739,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
       DrawYamYamContentAreas();
       break;
 
+    case ED_COUNTER_ID_BALL_CONTENT:
+      DrawMagicBallContentAreas();
+      break;
+
     case ED_COUNTER_ID_GROUP_CONTENT:
       DrawGroupElementArea(properties_element);
       CopyGroupElementPropertiesToGame(properties_element);
@@ -9511,6 +9535,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
 {
   static int start_lx, start_ly;
   int id = gi->custom_id;
+  int type_id = gi->custom_type_id;
   int sx = gi->event.x;
   int sy = gi->event.y;
   int lx = sx + level_xpos;
@@ -9629,67 +9654,27 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
   }
   else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
   {
-    int element = EL_EMPTY;
-
-    if (id == GADGET_ID_AMOEBA_CONTENT)
-      element = level.amoeba_content;
-    else if (id == GADGET_ID_CUSTOM_GRAPHIC)
-      element = custom_element.gfx_element;
-    else if (id == GADGET_ID_CUSTOM_CONTENT)
-      element = custom_element.content.e[sx][sy];
-    else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
-      element = custom_element.move_enter_element;
-    else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
-      element = custom_element.move_leave_element;
-    else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
-      element = custom_element_change.target_element;
-    else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-      element = custom_element_change.target_content.e[sx][sy];
-    else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
-      element = custom_element_change.trigger_element;
-    else if (id == GADGET_ID_GROUP_CONTENT)
-      element = group_element_info.element[sx];
-    else if (id == GADGET_ID_RANDOM_BACKGROUND)
-      element = random_placement_background_element;
-    else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
-            id <= GADGET_ID_YAMYAM_CONTENT_7)
-      element = level.yamyam_content[id -GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy];
-    else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
-            id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
-      element =level.ball_content[id-GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy];
+    int pos = sx * drawingarea_info[type_id].area_ysize + sy;
+    int element = drawingarea_info[type_id].value[pos];
 
     strncpy(infotext, getElementInfoText(element), max_infotext_len);
   }
   else
   {
-    if (id == GADGET_ID_AMOEBA_CONTENT)
-      strcpy(infotext, "Amoeba content");
-    else if (id == GADGET_ID_CUSTOM_GRAPHIC)
-      strcpy(infotext, "Custom graphic element");
-    else if (id == GADGET_ID_CUSTOM_CONTENT)
-      sprintf(infotext, "Custom element content position: %d, %d", sx, sy);
-    else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
-      strcpy(infotext, "Element that can be digged/collected");
-    else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
-      strcpy(infotext, "Element that will be left behind");
-    else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
-      strcpy(infotext, "New target element after change");
-    else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-      strcpy(infotext, "New extended elements after change");
-    else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
-      strcpy(infotext, "Other element triggering change");
+    if (id == GADGET_ID_CUSTOM_CONTENT)
+      sprintf(infotext, "custom element content position: %d, %d", sx, sy);
     else if (id == GADGET_ID_GROUP_CONTENT)
-      sprintf(infotext, "Group element position: %d", sx + 1);
-    else if (id == GADGET_ID_RANDOM_BACKGROUND)
-      strcpy(infotext, "Random placement background");
+      sprintf(infotext, "group element position: %d", sx + 1);
     else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
             id <= GADGET_ID_YAMYAM_CONTENT_7)
-      sprintf(infotext, "Content area %d position: %d, %d",
+      sprintf(infotext, "content area %d position: %d, %d",
              id - GADGET_ID_YAMYAM_CONTENT_0 + 1, sx, sy);
     else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
             id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
-      sprintf(infotext, "Content area %d position: %d, %d",
+      sprintf(infotext, "content area %d position: %d, %d",
              id - GADGET_ID_MAGIC_BALL_CONTENT_0 + 1, sx, sy);
+    else if (drawingarea_info[type_id].infotext != NULL)
+      strcpy(infotext, drawingarea_info[type_id].infotext);
   }
 
   infotext[max_infotext_len] = '\0';