fixed name of element 'beamer' to 'teleporter'
[rocksndiamonds.git] / src / editor.c
index 8da3feb9c03aa11ddf7e3055e2f686b64406bf00..fba668d1ccc2eded15fc8841fe96f0f184f92af9 100644 (file)
 #define INFOTEXT_XSIZE         SXSIZE
 #define INFOTEXT_YSIZE         getFontHeight(INFOTEXT_FONT)
 #define INFOTEXT_YSIZE_FULL    (INFOTEXT_YSIZE + ED_GADGET_SMALL_DISTANCE)
-#define INFOTEXT_XPOS          SX
-#define INFOTEXT_YPOS          (SY + SYSIZE - INFOTEXT_YSIZE)
+#define INFOTEXT_X             (editor.settings.tooltip.x)
+#define INFOTEXT_Y             (editor.settings.tooltip.y)
+#define INFOTEXT_XY_REDEFINED  (INFOTEXT_X != -1 || INFOTEXT_Y != -1)
+#define INFOTEXT_XPOS          SX + (INFOTEXT_XY_REDEFINED ? INFOTEXT_X : 0)
+#define INFOTEXT_YPOS          SY + (INFOTEXT_XY_REDEFINED ? INFOTEXT_Y : \
+                                     SYSIZE - INFOTEXT_YSIZE)
 
 
 /*
 #define GADGET_ID_CHECKBUTTON_FIRST    (GADGET_ID_SCROLLING_LIST_FIRST + 3)
 
 #define GADGET_ID_AUTO_COUNT_GEMS      (GADGET_ID_CHECKBUTTON_FIRST + 0)
-#define GADGET_ID_RANDOM_PERCENTAGE    (GADGET_ID_CHECKBUTTON_FIRST + 1)
-#define GADGET_ID_RANDOM_QUANTITY      (GADGET_ID_CHECKBUTTON_FIRST + 2)
-#define GADGET_ID_RANDOM_RESTRICTED    (GADGET_ID_CHECKBUTTON_FIRST + 3)
-#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 4)
-#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 5)
-#define GADGET_ID_EM_EXPLODES_BY_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 6)
-#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_AUTO_EXIT_SOKOBAN    (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_SHIFTED_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_LAZY_RELOCATION      (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_USE_INITIAL_INVENTORY        (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_MM_LASER_RED         (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_MM_LASER_GREEN       (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_MM_LASER_BLUE                (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_DF_LASER_RED         (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_DF_LASER_GREEN       (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_DF_LASER_BLUE                (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 45)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 46)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 47)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 48)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 49)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 50)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 51)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE_1        (GADGET_ID_CHECKBUTTON_FIRST + 52)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE_2        (GADGET_ID_CHECKBUTTON_FIRST + 53)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE_3        (GADGET_ID_CHECKBUTTON_FIRST + 54)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 55)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 56)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 57)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 58)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 59)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 60)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 61)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 62)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 63)
+#define GADGET_ID_USE_LEVELSET_ARTWORK (GADGET_ID_CHECKBUTTON_FIRST + 1)
+#define GADGET_ID_COPY_LEVEL_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 2)
+#define GADGET_ID_RANDOM_PERCENTAGE    (GADGET_ID_CHECKBUTTON_FIRST + 3)
+#define GADGET_ID_RANDOM_QUANTITY      (GADGET_ID_CHECKBUTTON_FIRST + 4)
+#define GADGET_ID_RANDOM_RESTRICTED    (GADGET_ID_CHECKBUTTON_FIRST + 5)
+#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 6)
+#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 7)
+#define GADGET_ID_EM_EXPLODES_BY_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_AUTO_EXIT_SOKOBAN    (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_SHIFTED_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_LAZY_RELOCATION      (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_USE_INITIAL_INVENTORY        (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_MM_LASER_RED         (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_MM_LASER_GREEN       (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_MM_LASER_BLUE                (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_DF_LASER_RED         (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_DF_LASER_GREEN       (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_DF_LASER_BLUE                (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 50)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 51)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 52)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 53)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE_1        (GADGET_ID_CHECKBUTTON_FIRST + 54)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE_2        (GADGET_ID_CHECKBUTTON_FIRST + 55)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE_3        (GADGET_ID_CHECKBUTTON_FIRST + 56)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 57)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 58)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 59)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 60)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 61)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 62)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 63)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 64)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 65)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 64)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 66)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS      0
-#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    1
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3        2
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2        3
-#define ED_CHECKBUTTON_ID_STICK_ELEMENT                4
-#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     5
-#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE  6
-#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       7
-#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     8
-#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  9
-#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   10
-#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   11
-#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN    12
-#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  13
-#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     14
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     15
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  16
-#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   17
-#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION   18
-#define ED_CHECKBUTTON_ID_LAZY_RELOCATION      19
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    20
-#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  21
-#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        22
-#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      23
-#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY        24
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 25
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   26
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   27
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    28
-#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    29
-#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    30
-#define ED_CHECKBUTTON_ID_MM_LASER_RED         31
-#define ED_CHECKBUTTON_ID_MM_LASER_GREEN       32
-#define ED_CHECKBUTTON_ID_MM_LASER_BLUE                33
-#define ED_CHECKBUTTON_ID_DF_LASER_RED         34
-#define ED_CHECKBUTTON_ID_DF_LASER_GREEN       35
-#define ED_CHECKBUTTON_ID_DF_LASER_BLUE                36
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   37
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1        38
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    39
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        40
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        41
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        42
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        43
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      44
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      45
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     46
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      47
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                48
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   49
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  50
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 51
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        52
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    53
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         54
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 55
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  56
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 57
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   58
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 59
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    60
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    61
-
-#define ED_NUM_CHECKBUTTONS                    62
+#define ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK 1
+#define ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE  2
+#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    3
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3        4
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2        5
+#define ED_CHECKBUTTON_ID_STICK_ELEMENT                6
+#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     7
+#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE  8
+#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       9
+#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     10
+#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  11
+#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   12
+#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   13
+#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN    14
+#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  15
+#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     16
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     17
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  18
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   19
+#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION   20
+#define ED_CHECKBUTTON_ID_LAZY_RELOCATION      21
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    22
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  23
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        24
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      25
+#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY        26
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 27
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   28
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   29
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    30
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    31
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    32
+#define ED_CHECKBUTTON_ID_MM_LASER_RED         33
+#define ED_CHECKBUTTON_ID_MM_LASER_GREEN       34
+#define ED_CHECKBUTTON_ID_MM_LASER_BLUE                35
+#define ED_CHECKBUTTON_ID_DF_LASER_RED         36
+#define ED_CHECKBUTTON_ID_DF_LASER_GREEN       37
+#define ED_CHECKBUTTON_ID_DF_LASER_BLUE                38
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   39
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1        40
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    41
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        42
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        43
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        44
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        45
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      46
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      47
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     48
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      49
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                50
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   51
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  52
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 53
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        54
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    55
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         56
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 57
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  58
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 59
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   60
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 61
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    62
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    63
+
+#define ED_NUM_CHECKBUTTONS                    64
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS
 
+#define ED_CHECKBUTTON_ID_LEVELSET_FIRST ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK
+#define ED_CHECKBUTTON_ID_LEVELSET_LAST         ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE
+
 #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_EDITOR_LAST  ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2
 
 
 /* default value for element tile size in drawing area */
 #define DEFAULT_EDITOR_TILESIZE                MINI_TILESIZE
+#define DEFAULT_EDITOR_TILESIZE_MM     TILESIZE
 
 
 /*
@@ -1297,7 +1309,8 @@ static struct ElementInfo custom_element;
 static char levelset_name[MAX_LEVEL_NAME_LEN + 1];
 static char levelset_author[MAX_LEVEL_AUTHOR_LEN + 1];
 static int levelset_num_levels = 100;
-static int levelset_first_level_nr = 1;
+static boolean levelset_use_levelset_artwork = FALSE;
+static boolean levelset_copy_level_template = FALSE;
 static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 
 static struct
@@ -2418,7 +2431,7 @@ static struct
     NULL, "game engine:", NULL,                "game engine"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_LEVELSET_SAVE_MODE,      GADGET_ID_NONE,
     -1,
     options_levelset_save_mode,
@@ -2728,7 +2741,7 @@ static struct
   /* ---------- level and editor settings (buttons) ------------------------ */
 
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_SAVE_LEVELSET,           GADGET_ID_LEVELSET_SAVE_MODE,
     -1,                                        "Save",
     NULL, NULL, NULL,                  "Update or create level set"
@@ -2925,6 +2938,20 @@ static struct
     NULL, NULL,
     "automatically count gems needed", "set counter to number of gems"
   },
+  {
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
+    GADGET_ID_USE_LEVELSET_ARTWORK,    GADGET_ID_NONE,
+    &levelset_use_levelset_artwork,
+    NULL, NULL,
+    "use current custom artwork",      "use custom artwork of this level set"
+  },
+  {
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
+    GADGET_ID_COPY_LEVEL_TEMPLATE,     GADGET_ID_NONE,
+    &levelset_copy_level_template,
+    NULL, NULL,
+    "copy current level template",     "copy level template of this level set"
+  },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
     GADGET_ID_RANDOM_RESTRICTED,       GADGET_ID_NONE,
@@ -3688,6 +3715,7 @@ static int level_xpos = -1, level_ypos = -1;
 
 /* actual tile size used to display playfield drawing area */
 static int ed_tilesize = DEFAULT_EDITOR_TILESIZE;
+static int ed_tilesize_default = DEFAULT_EDITOR_TILESIZE;
 
 #define IN_ED_FIELD(x,y)       IN_FIELD(x, y, ed_fieldx, ed_fieldy)
 
@@ -3719,6 +3747,7 @@ static void ModifyEditorDrawingArea(int, int, int);
 static void ModifyEditorElementList();
 static void AdjustElementListScrollbar();
 static void RedrawDrawingElements();
+static void DrawDrawingWindowExt(boolean);
 static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
 static void DrawPropertiesWindow();
@@ -3742,6 +3771,9 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *);
 static void PrintEditorGadgetInfoText(struct GadgetInfo *);
 static boolean AskToCopyAndModifyLevelTemplate();
 static boolean getDrawModeHiRes();
+static int getTabulatorBarWidth();
+static int getTabulatorBarHeight();
+static Pixel getTabulatorBarColor();
 
 static int num_editor_gadgets = 0;     /* dynamically determined */
 
@@ -3841,12 +3873,12 @@ static int editor_el_emerald_mine[] =
   EL_NUT,
   EL_BOMB,
 
-  EL_WALL_EMERALD,
-  EL_WALL_DIAMOND,
-  EL_DYNAMITE,
-  EL_DYNAMITE_ACTIVE,
+  EL_EM_DYNAMITE,
+  EL_EM_DYNAMITE_ACTIVE,
+  EL_EM_EXIT_CLOSED,
+  EL_EM_EXIT_OPEN,
 
-  EL_YAMYAM,
+  EL_YAMYAM_UP,
   EL_BUG_UP,
   EL_SPACESHIP_UP,
   EL_ROBOT,
@@ -3885,11 +3917,6 @@ static int editor_el_emerald_mine[] =
   EL_EM_GATE_2_GRAY,
   EL_EM_GATE_3_GRAY,
   EL_EM_GATE_4_GRAY,
-
-  EL_EM_EXIT_CLOSED,
-  EL_EM_EXIT_OPEN,
-  EL_EM_STEEL_EXIT_CLOSED,
-  EL_EM_STEEL_EXIT_OPEN,
 };
 static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine;
 static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine;
@@ -3963,8 +3990,8 @@ static int editor_el_emerald_mine_club[] =
 
   EL_EMC_LENSES,
   EL_EMC_MAGNIFIER,
-  EL_EM_DYNAMITE,
-  EL_EM_DYNAMITE_ACTIVE,
+  EL_EMPTY,
+  EL_EMPTY,
 
   EL_BALLOON,
   EL_YAMYAM_UP,
@@ -3996,6 +4023,11 @@ static int editor_hl_rnd[] =
 
 static int editor_el_rnd[] =
 {
+  EL_DYNAMITE,                 /* RND */
+  EL_DYNAMITE_ACTIVE,          /* RND */
+  EL_EMPTY,
+  EL_EMPTY,
+
   EL_KEY_1,
   EL_KEY_2,
   EL_KEY_3,
@@ -4039,7 +4071,7 @@ static int editor_el_rnd[] =
   EL_PACMAN_LEFT,
   EL_DARK_YAMYAM,
   EL_PACMAN_RIGHT,
-  EL_EMPTY,
+  EL_YAMYAM,                   /* RND */
 
   EL_BLACK_ORB,
   EL_PACMAN_DOWN,
@@ -4186,6 +4218,11 @@ static int editor_hl_diamond_caves[] =
 
 static int editor_el_diamond_caves[] =
 {
+  EL_EM_STEEL_EXIT_CLOSED,     /* DC2 */
+  EL_EM_STEEL_EXIT_OPEN,       /* DC2 */
+  EL_WALL_EMERALD,             /* DC2 */
+  EL_WALL_DIAMOND,             /* DC2 */
+
   EL_PEARL,
   EL_CRYSTAL,
   EL_WALL_PEARL,
@@ -4385,13 +4422,13 @@ static int editor_el_mirror_magic[] =
 
   EL_MM_MIRROR_START,
   EL_MM_MIRROR_FIXED_START,
-  EL_MM_POLARISATOR_START,
-  EL_MM_POLARISATOR_CROSS_START,
+  EL_MM_POLARIZER_START,
+  EL_MM_POLARIZER_CROSS_START,
 
-  EL_MM_BEAMER_RED_START,
-  EL_MM_BEAMER_YELLOW_START,
-  EL_MM_BEAMER_GREEN_START,
-  EL_MM_BEAMER_BLUE_START,
+  EL_MM_TELEPORTER_RED_START,
+  EL_MM_TELEPORTER_YELLOW_START,
+  EL_MM_TELEPORTER_GREEN_START,
+  EL_MM_TELEPORTER_BLUE_START,
 
   EL_MM_PRISM,
   EL_MM_FUSE_ACTIVE,
@@ -5431,6 +5468,13 @@ char *getElementDescriptionFilename(int element)
   return NULL;
 }
 
+static boolean suppressBorderElement()
+{
+  return (level.game_engine_type == GAME_ENGINE_TYPE_MM &&
+         lev_fieldx <= MAX_ED_FIELDX &&
+         lev_fieldy <= MAX_ED_FIELDY);
+}
+
 static void InitDynamicEditorElementList(int **elements, int *num_elements)
 {
   boolean element_found[NUM_FILE_ELEMENTS];
@@ -5689,6 +5733,10 @@ static void ReinitializeElementList()
 
     num_editor_elements += num_editor_el_empty;
   }
+  else
+  {
+    num_editor_el_empty = 0;
+  }
 
   editor_elements = checked_malloc(num_editor_elements * sizeof(int));
 
@@ -5869,6 +5917,45 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
 }
 
+static void DrawEditorLevelBorderLine(int x, int y, int xsize, int ysize)
+{
+  int xsize_tile = MAX(ed_tilesize, xsize);
+  int ysize_tile = MAX(ed_tilesize, ysize);
+  int xsize_full = xsize + 1;
+  int ysize_full = ysize + 1;
+  int xsize_thin = (xsize < ed_tilesize ? 1 : xsize);
+  int ysize_thin = (ysize < ed_tilesize ? 1 : ysize);
+  Pixel line_color = getTabulatorBarColor();
+
+  if (line_color == BLACK_PIXEL)               /* black => transparent */
+    return;
+
+  FillRectangle(drawto, SX + x, SY + y, xsize_tile, ysize_tile, BLACK_PIXEL);
+  FillRectangle(drawto, SX + x, SY + y, xsize_full, ysize_full, line_color);
+  FillRectangle(drawto, SX + x, SY + y, xsize_thin, ysize_thin, BLACK_PIXEL);
+}
+
+static void DrawEditorLevelBorderLinesIfNeeded()
+{
+  int xsize = lev_fieldx * ed_tilesize;
+  int ysize = lev_fieldy * ed_tilesize;
+  int line_size = getTabulatorBarHeight();
+
+  if (!suppressBorderElement())
+    return;
+
+  /* draw little border line around editable level playfield */
+
+  if (xsize < SXSIZE)
+    DrawEditorLevelBorderLine(xsize, 0, line_size, ysize);
+
+  if (ysize < SYSIZE)
+    DrawEditorLevelBorderLine(0, ysize, xsize, line_size);
+
+  if (xsize < SXSIZE && ysize < SYSIZE)
+    DrawEditorLevelBorderLine(xsize, ysize, line_size, line_size);
+}
+
 static void DrawEditorElement(int x, int y, int element)
 {
   DrawSizedElement(x, y, element, ed_tilesize);
@@ -5887,6 +5974,7 @@ static void DrawEditorElementOrWall(int x, int y, int scroll_x, int scroll_y)
 static void DrawEditorLevel(int size_x, int size_y, int scroll_x, int scroll_y)
 {
   DrawSizedLevel(size_x, size_y, scroll_x, scroll_y, ed_tilesize);
+  DrawEditorLevelBorderLinesIfNeeded();
 }
 
 static void DrawDrawingArea(int id)
@@ -7339,6 +7427,12 @@ static void MapMainDrawingArea()
   boolean no_vertical_scrollbar = (lev_fieldy + 2 <= ed_fieldy);
   int i;
 
+  if (suppressBorderElement())
+  {
+    no_horizontal_scrollbar = (lev_fieldx <= ed_fieldx);
+    no_vertical_scrollbar   = (lev_fieldy <= ed_fieldy);
+  }
+
   for (i=ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++)
   {
     if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT ||
@@ -7469,10 +7563,13 @@ static void ResetUndoBuffer()
   level.changed = FALSE;
 }
 
-static void DrawEditModeWindow()
+static void DrawEditModeWindowExt(boolean remap_toolbox_gadgets)
 {
-  ModifyEditorElementList();
-  RedrawDrawingElements();
+  if (remap_toolbox_gadgets)
+  {
+    ModifyEditorElementList();
+    RedrawDrawingElements();
+  }
 
   if (edit_mode == ED_MODE_INFO)
     DrawLevelInfoWindow();
@@ -7481,7 +7578,17 @@ static void DrawEditModeWindow()
   else if (edit_mode == ED_MODE_PALETTE)
     DrawPaletteWindow();
   else /* edit_mode == ED_MODE_DRAWING */
-    DrawDrawingWindow();
+    DrawDrawingWindowExt(remap_toolbox_gadgets);
+}
+
+static void DrawEditModeWindow()
+{
+  DrawEditModeWindowExt(TRUE);
+}
+
+static void DrawEditModeWindow_PlayfieldOnly()
+{
+  DrawEditModeWindowExt(FALSE);
 }
 
 static void ChangeEditModeWindow(int new_edit_mode)
@@ -7591,7 +7698,7 @@ static void ModifyLevelInfoForSavingIntoPersonalLevelSet(char *former_name)
   }
 
   if (level_nr > leveldir_current->last_level)
-    UpdateUserLevelSet(getLoginName(), NULL, NULL, level_nr + 9, -1);
+    UpdateUserLevelSet(getLoginName(), NULL, NULL, level_nr + 9);
 
   // else: allow the save even if annotation failed
 
@@ -8201,7 +8308,8 @@ static int getMaxEdFieldX(boolean has_scrollbar)
 
 static int getMaxEdFieldY(boolean has_scrollbar)
 {
-  int infotext_height = INFOTEXT_YSIZE_FULL;
+  int infotext_height = (IN_PIX_FIELD(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY) ?
+                        INFOTEXT_YSIZE_FULL : 0);
   int scrollbar_height = (has_scrollbar ? ED_SCROLLBUTTON_YSIZE : 0);
   int sysize = SYSIZE - scrollbar_height - infotext_height;
   int max_ed_fieldy = sysize / ed_tilesize;
@@ -8211,18 +8319,62 @@ static int getMaxEdFieldY(boolean has_scrollbar)
 
 void InitZoomLevelSettings(int zoom_tilesize)
 {
-  if (zoom_tilesize == -1)
-    zoom_tilesize = setup.auto_setup.editor_zoom_tilesize;
+  static int last_game_engine_type = GAME_ENGINE_TYPE_UNKNOWN;
+
+  if (zoom_tilesize == -1 && level.game_engine_type != last_game_engine_type)
+  {
+    ed_tilesize = setup.auto_setup.editor_zoom_tilesize;
+    ed_tilesize_default = DEFAULT_EDITOR_TILESIZE;
+
+    if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    {
+      ed_tilesize = DEFAULT_EDITOR_TILESIZE_MM;
+      ed_tilesize_default = DEFAULT_EDITOR_TILESIZE_MM;
+    }
+  }
+
+  last_game_engine_type = level.game_engine_type;
 
   // limit zoom tilesize by upper and lower bound
-  zoom_tilesize = MIN(MAX(MICRO_TILESIZE, zoom_tilesize), TILESIZE);
+  ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE);
 
-  ed_tilesize = setup.auto_setup.editor_zoom_tilesize = zoom_tilesize;
+  // store zoom tilesize in auto setup file only if it was manually changed
+  if (zoom_tilesize != -1)
+    setup.auto_setup.editor_zoom_tilesize = ed_tilesize;
 
   MAX_ED_FIELDX = getMaxEdFieldX(FALSE);
   MAX_ED_FIELDY = getMaxEdFieldY(FALSE);
 }
 
+static void InitDrawingElements()
+{
+  static int game_engine_type_last = GAME_ENGINE_TYPE_UNKNOWN;
+
+  if (level.game_engine_type == game_engine_type_last)
+    return;
+
+  if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    new_element1 = EL_SP_CHIP_SINGLE;
+    new_element2 = EL_EMPTY;
+    new_element3 = EL_SP_BASE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+  {
+    new_element1 = EL_MM_MIRROR_START;
+    new_element2 = EL_EMPTY;
+    new_element3 = EL_MM_WOODEN_WALL;
+  }
+  else
+  {
+    new_element1 = EL_WALL;
+    new_element2 = EL_EMPTY;
+    new_element3 = EL_SAND;
+  }
+
+  game_engine_type_last = level.game_engine_type;
+}
+
 static void InitLevelSetInfo()
 {
   snprintf(levelset_name,   MAX_LEVEL_NAME_LEN + 1,
@@ -8230,8 +8382,10 @@ static void InitLevelSetInfo()
   snprintf(levelset_author, MAX_LEVEL_AUTHOR_LEN + 1,
           "%s", leveldir_current->author);
 
-  levelset_num_levels     = leveldir_current->levels;
-  levelset_first_level_nr = leveldir_current->first_level;
+  levelset_num_levels = leveldir_current->levels;
+
+  levelset_use_levelset_artwork = FALSE;
+  levelset_copy_level_template = FALSE;
 
   levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 }
@@ -8256,13 +8410,65 @@ static void ChangeEditorToLevelSet(char *levelset_subdir)
   DrawLevelEd();
 }
 
+static boolean useEditorDoorAnimation()
+{
+  struct RectWithBorder *vp_door_1 = &viewport.door_1[GAME_MODE_MAIN];
+  boolean door_1_viewport_unchanged =
+    (vp_door_1->x      == DX     &&
+     vp_door_1->y      == DY     &&
+     vp_door_1->width  == DXSIZE &&
+     vp_door_1->height == DYSIZE);
+  boolean door_1_contains_toolbox =
+    (EX >= DX &&
+     EY >= DY &&
+     EX + EXSIZE <= DX + DXSIZE &&
+     EY + EYSIZE <= DY + DYSIZE);
+
+  return (door_1_viewport_unchanged && door_1_contains_toolbox);
+}
+
+void DrawEditorDoorContent()
+{
+  /* needed for gadgets drawn on background (like palette scrollbar) */
+  SetDoorBackgroundImage(IMG_UNDEFINED);
+
+  /* copy default editor door content to main double buffer */
+  BlitBitmap(graphic_info[IMG_BACKGROUND_PALETTE].bitmap, drawto,
+            graphic_info[IMG_BACKGROUND_PALETTE].src_x,
+            graphic_info[IMG_BACKGROUND_PALETTE].src_y,
+            MIN(DXSIZE, graphic_info[IMG_BACKGROUND_PALETTE].width),
+            MIN(DYSIZE, graphic_info[IMG_BACKGROUND_PALETTE].height),
+            DX, DY);
+
+  /* draw bigger door */
+  DrawSpecialEditorDoor();
+
+  /* draw new control window */
+  BlitBitmap(graphic_info[IMG_BACKGROUND_TOOLBOX].bitmap, drawto,
+            graphic_info[IMG_BACKGROUND_TOOLBOX].src_x,
+            graphic_info[IMG_BACKGROUND_TOOLBOX].src_y,
+            MIN(EXSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].width),
+            MIN(EYSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].height),
+            EX, EY);
+
+  /* draw all toolbox gadgets to editor doors */
+  MapControlButtons();
+
+  /* draw all palette gadgets to editor doors */
+  ModifyEditorElementList();
+  RedrawDrawingElements();
+
+  /* copy actual editor door content to door double buffer for OpenDoor() */
+  BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+}
+
 void DrawLevelEd()
 {
   int fade_mask = REDRAW_FIELD;
 
   FadeSoundsAndMusic();
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
@@ -8273,10 +8479,9 @@ void DrawLevelEd()
   ClearField();
 
   InitZoomLevelSettings(-1);
+  InitDrawingElements();
   InitLevelSetInfo();
 
-  OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
-
 #if DEBUG
   CheckElementDescriptions();
 #endif
@@ -8300,28 +8505,6 @@ void DrawLevelEd()
     level_ypos = -1;
   }
 
-  /* needed for gadgets drawn on background (like palette scrollbar) */
-  SetDoorBackgroundImage(IMG_UNDEFINED);
-
-  /* copy default editor door content to main double buffer */
-  BlitBitmap(graphic_info[IMG_BACKGROUND_PALETTE].bitmap, drawto,
-            graphic_info[IMG_BACKGROUND_PALETTE].src_x,
-            graphic_info[IMG_BACKGROUND_PALETTE].src_y,
-            MIN(DXSIZE, graphic_info[IMG_BACKGROUND_PALETTE].width),
-            MIN(DYSIZE, graphic_info[IMG_BACKGROUND_PALETTE].height),
-            DX, DY);
-
-  /* draw bigger door */
-  DrawSpecialEditorDoor();
-
-  /* draw new control window */
-  BlitBitmap(graphic_info[IMG_BACKGROUND_TOOLBOX].bitmap, drawto,
-            graphic_info[IMG_BACKGROUND_TOOLBOX].src_x,
-            graphic_info[IMG_BACKGROUND_TOOLBOX].src_y,
-            MIN(EXSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].width),
-            MIN(EYSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].height),
-            EX, EY);
-
   // redraw_mask |= REDRAW_ALL;
 
   FreeLevelEditorGadgets();
@@ -8333,16 +8516,28 @@ void DrawLevelEd()
   InitElementPropertiesGfxElement();
 
   UnmapAllGadgets();
-  MapControlButtons();
 
-  DrawEditModeWindow();
+  DrawEditModeWindow_PlayfieldOnly();
 
   DrawMaskedBorder(fade_mask);
 
-  FadeIn(fade_mask);
+  // use door animation if door 1 viewport is unchanged and contains toolbox
+  if (useEditorDoorAnimation())
+  {
+    FadeIn(fade_mask);
 
-  /* copy actual editor door content to door double buffer for OpenDoor() */
-  BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+    DrawEditorDoorContent();
+
+    OpenDoor(DOOR_OPEN_1 | DOOR_FORCE_ANIM);
+  }
+  else
+  {
+    DrawEditorDoorContent();
+
+    FadeIn(fade_mask);
+  }
+
+  SetDoorState(DOOR_OPEN_1 | DOOR_OPEN_2);
 }
 
 static void AdjustDrawingAreaGadgets()
@@ -8355,6 +8550,12 @@ static void AdjustDrawingAreaGadgets()
   boolean vertical_scrollbar_needed;
   int x, y, width, height;
 
+  if (suppressBorderElement())
+  {
+    ed_xsize = max_ed_fieldx;
+    ed_ysize = max_ed_fieldy;
+  }
+
   /* check if we need any scrollbars */
   horizontal_scrollbar_needed = (ed_xsize > max_ed_fieldx);
   vertical_scrollbar_needed   = (ed_ysize > max_ed_fieldy);
@@ -8430,6 +8631,12 @@ static void AdjustLevelScrollPosition()
     level_ypos = lev_fieldy - ed_fieldy + 1;
   if (lev_fieldy < ed_fieldy - 2)
     level_ypos = -1;
+
+  if (suppressBorderElement())
+  {
+    level_xpos = 0;
+    level_ypos = 0;
+  }
 }
 
 static void AdjustEditorScrollbar(int id)
@@ -8627,7 +8834,7 @@ static void RedrawDrawingElements()
   PickDrawingElement(3, new_element3);
 }
 
-static void DrawDrawingWindow()
+static void DrawDrawingWindowExt(boolean remap_toolbox_gadgets)
 {
   stick_element_properties_window = FALSE;
 
@@ -8635,7 +8842,6 @@ static void DrawDrawingWindow()
   ClearField();
 
   UnmapLevelEditorFieldGadgets();
-  UnmapLevelEditorToolboxCustomGadgets();
 
   AdjustDrawingAreaGadgets();
   AdjustLevelScrollPosition();
@@ -8645,7 +8851,17 @@ static void DrawDrawingWindow()
   DrawEditorLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
 
   MapMainDrawingArea();
-  MapLevelEditorToolboxDrawingGadgets();
+
+  if (remap_toolbox_gadgets)
+  {
+    UnmapLevelEditorToolboxCustomGadgets();
+    MapLevelEditorToolboxDrawingGadgets();
+  }
+}
+
+static void DrawDrawingWindow()
+{
+  DrawDrawingWindowExt(TRUE);
 }
 
 static int getTabulatorBarWidth()
@@ -8661,13 +8877,20 @@ static int getTabulatorBarHeight()
   return ED_TAB_BAR_HEIGHT;
 }
 
-static void DrawLevelInfoTabulatorGadgets()
+static Pixel getTabulatorBarColor()
 {
   struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
   struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED];
   int gd_x = gd->x + gd_gi1->border.width / 2;
   int gd_y = gd->y + gd_gi1->height - 1;
-  Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y);
+
+  return GetPixel(gd->bitmap, gd_x, gd_y);
+}
+
+static void DrawLevelInfoTabulatorGadgets()
+{
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
+  Pixel tab_color = getTabulatorBarColor();
   int id_first = ED_TAB_BUTTON_ID_LEVELINFO_FIRST;
   int id_last  = ED_TAB_BUTTON_ID_LEVELINFO_LAST;
   int i;
@@ -8811,12 +9034,25 @@ static void DrawLevelInfoLevelSet_DirectoryInfo()
 
 static void DrawLevelInfoLevelSet()
 {
+  boolean artwork_exists = checkIfCustomArtworkExistsForCurrentLevelSet();
+  boolean template_exists = fileExists(getLocalLevelTemplateFilename());
   int i;
 
   /* draw counter gadgets */
   for (i = ED_COUNTER_ID_LEVELSET_FIRST; i <= ED_COUNTER_ID_LEVELSET_LAST; i++)
     MapCounterButtons(i);
 
+  /* draw checkbutton gadgets */
+  for (i = ED_CHECKBUTTON_ID_LEVELSET_FIRST; i <= ED_CHECKBUTTON_ID_LEVELSET_LAST; i++)
+  {
+    if (levelset_save_mode == LEVELSET_SAVE_MODE_UPDATE ||
+       (i == ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK && !artwork_exists) ||
+       (i == ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE  && !template_exists))
+      continue;
+
+    MapCheckbuttonGadget(i);
+  }
+
   /* draw selectbox gadgets */
   for (i = ED_SELECTBOX_ID_LEVELSET_FIRST; i <= ED_SELECTBOX_ID_LEVELSET_LAST; i++)
     MapSelectboxGadget(i);
@@ -10965,10 +11201,10 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
        EL_MM_WOODEN_GRID_FIXED_3
       },
       {
-       EL_MM_POLARISATOR_CROSS_1,
-       EL_MM_POLARISATOR_CROSS_4,
-       EL_MM_POLARISATOR_CROSS_3,
-       EL_MM_POLARISATOR_CROSS_2
+       EL_MM_POLARIZER_CROSS_1,
+       EL_MM_POLARIZER_CROSS_4,
+       EL_MM_POLARIZER_CROSS_3,
+       EL_MM_POLARIZER_CROSS_2
       },
       {
        EL_MM_PACMAN_UP,
@@ -11061,112 +11297,112 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
        EL_MM_MIRROR_2
       },
       {
-       EL_MM_BEAMER_5,
-       EL_MM_BEAMER_4,
-       EL_MM_BEAMER_3,
-       EL_MM_BEAMER_2,
-       EL_MM_BEAMER_1,
-       EL_MM_BEAMER_16,
-       EL_MM_BEAMER_15,
-       EL_MM_BEAMER_14,
-       EL_MM_BEAMER_13,
-       EL_MM_BEAMER_12,
-       EL_MM_BEAMER_11,
-       EL_MM_BEAMER_10,
-       EL_MM_BEAMER_9,
-       EL_MM_BEAMER_8,
-       EL_MM_BEAMER_7,
-       EL_MM_BEAMER_6
+       EL_MM_TELEPORTER_5,
+       EL_MM_TELEPORTER_4,
+       EL_MM_TELEPORTER_3,
+       EL_MM_TELEPORTER_2,
+       EL_MM_TELEPORTER_1,
+       EL_MM_TELEPORTER_16,
+       EL_MM_TELEPORTER_15,
+       EL_MM_TELEPORTER_14,
+       EL_MM_TELEPORTER_13,
+       EL_MM_TELEPORTER_12,
+       EL_MM_TELEPORTER_11,
+       EL_MM_TELEPORTER_10,
+       EL_MM_TELEPORTER_9,
+       EL_MM_TELEPORTER_8,
+       EL_MM_TELEPORTER_7,
+       EL_MM_TELEPORTER_6
       },
       {
-       EL_MM_BEAMER_RED_5,
-       EL_MM_BEAMER_RED_4,
-       EL_MM_BEAMER_RED_3,
-       EL_MM_BEAMER_RED_2,
-       EL_MM_BEAMER_RED_1,
-       EL_MM_BEAMER_RED_16,
-       EL_MM_BEAMER_RED_15,
-       EL_MM_BEAMER_RED_14,
-       EL_MM_BEAMER_RED_13,
-       EL_MM_BEAMER_RED_12,
-       EL_MM_BEAMER_RED_11,
-       EL_MM_BEAMER_RED_10,
-       EL_MM_BEAMER_RED_9,
-       EL_MM_BEAMER_RED_8,
-       EL_MM_BEAMER_RED_7,
-       EL_MM_BEAMER_RED_6
+       EL_MM_TELEPORTER_RED_5,
+       EL_MM_TELEPORTER_RED_4,
+       EL_MM_TELEPORTER_RED_3,
+       EL_MM_TELEPORTER_RED_2,
+       EL_MM_TELEPORTER_RED_1,
+       EL_MM_TELEPORTER_RED_16,
+       EL_MM_TELEPORTER_RED_15,
+       EL_MM_TELEPORTER_RED_14,
+       EL_MM_TELEPORTER_RED_13,
+       EL_MM_TELEPORTER_RED_12,
+       EL_MM_TELEPORTER_RED_11,
+       EL_MM_TELEPORTER_RED_10,
+       EL_MM_TELEPORTER_RED_9,
+       EL_MM_TELEPORTER_RED_8,
+       EL_MM_TELEPORTER_RED_7,
+       EL_MM_TELEPORTER_RED_6
       },
       {
-       EL_MM_BEAMER_YELLOW_5,
-       EL_MM_BEAMER_YELLOW_4,
-       EL_MM_BEAMER_YELLOW_3,
-       EL_MM_BEAMER_YELLOW_2,
-       EL_MM_BEAMER_YELLOW_1,
-       EL_MM_BEAMER_YELLOW_16,
-       EL_MM_BEAMER_YELLOW_15,
-       EL_MM_BEAMER_YELLOW_14,
-       EL_MM_BEAMER_YELLOW_13,
-       EL_MM_BEAMER_YELLOW_12,
-       EL_MM_BEAMER_YELLOW_11,
-       EL_MM_BEAMER_YELLOW_10,
-       EL_MM_BEAMER_YELLOW_9,
-       EL_MM_BEAMER_YELLOW_8,
-       EL_MM_BEAMER_YELLOW_7,
-       EL_MM_BEAMER_YELLOW_6
+       EL_MM_TELEPORTER_YELLOW_5,
+       EL_MM_TELEPORTER_YELLOW_4,
+       EL_MM_TELEPORTER_YELLOW_3,
+       EL_MM_TELEPORTER_YELLOW_2,
+       EL_MM_TELEPORTER_YELLOW_1,
+       EL_MM_TELEPORTER_YELLOW_16,
+       EL_MM_TELEPORTER_YELLOW_15,
+       EL_MM_TELEPORTER_YELLOW_14,
+       EL_MM_TELEPORTER_YELLOW_13,
+       EL_MM_TELEPORTER_YELLOW_12,
+       EL_MM_TELEPORTER_YELLOW_11,
+       EL_MM_TELEPORTER_YELLOW_10,
+       EL_MM_TELEPORTER_YELLOW_9,
+       EL_MM_TELEPORTER_YELLOW_8,
+       EL_MM_TELEPORTER_YELLOW_7,
+       EL_MM_TELEPORTER_YELLOW_6
       },
       {
-       EL_MM_BEAMER_GREEN_5,
-       EL_MM_BEAMER_GREEN_4,
-       EL_MM_BEAMER_GREEN_3,
-       EL_MM_BEAMER_GREEN_2,
-       EL_MM_BEAMER_GREEN_1,
-       EL_MM_BEAMER_GREEN_16,
-       EL_MM_BEAMER_GREEN_15,
-       EL_MM_BEAMER_GREEN_14,
-       EL_MM_BEAMER_GREEN_13,
-       EL_MM_BEAMER_GREEN_12,
-       EL_MM_BEAMER_GREEN_11,
-       EL_MM_BEAMER_GREEN_10,
-       EL_MM_BEAMER_GREEN_9,
-       EL_MM_BEAMER_GREEN_8,
-       EL_MM_BEAMER_GREEN_7,
-       EL_MM_BEAMER_GREEN_6
+       EL_MM_TELEPORTER_GREEN_5,
+       EL_MM_TELEPORTER_GREEN_4,
+       EL_MM_TELEPORTER_GREEN_3,
+       EL_MM_TELEPORTER_GREEN_2,
+       EL_MM_TELEPORTER_GREEN_1,
+       EL_MM_TELEPORTER_GREEN_16,
+       EL_MM_TELEPORTER_GREEN_15,
+       EL_MM_TELEPORTER_GREEN_14,
+       EL_MM_TELEPORTER_GREEN_13,
+       EL_MM_TELEPORTER_GREEN_12,
+       EL_MM_TELEPORTER_GREEN_11,
+       EL_MM_TELEPORTER_GREEN_10,
+       EL_MM_TELEPORTER_GREEN_9,
+       EL_MM_TELEPORTER_GREEN_8,
+       EL_MM_TELEPORTER_GREEN_7,
+       EL_MM_TELEPORTER_GREEN_6
       },
       {
-       EL_MM_BEAMER_BLUE_5,
-       EL_MM_BEAMER_BLUE_4,
-       EL_MM_BEAMER_BLUE_3,
-       EL_MM_BEAMER_BLUE_2,
-       EL_MM_BEAMER_BLUE_1,
-       EL_MM_BEAMER_BLUE_16,
-       EL_MM_BEAMER_BLUE_15,
-       EL_MM_BEAMER_BLUE_14,
-       EL_MM_BEAMER_BLUE_13,
-       EL_MM_BEAMER_BLUE_12,
-       EL_MM_BEAMER_BLUE_11,
-       EL_MM_BEAMER_BLUE_10,
-       EL_MM_BEAMER_BLUE_9,
-       EL_MM_BEAMER_BLUE_8,
-       EL_MM_BEAMER_BLUE_7,
-       EL_MM_BEAMER_BLUE_6
+       EL_MM_TELEPORTER_BLUE_5,
+       EL_MM_TELEPORTER_BLUE_4,
+       EL_MM_TELEPORTER_BLUE_3,
+       EL_MM_TELEPORTER_BLUE_2,
+       EL_MM_TELEPORTER_BLUE_1,
+       EL_MM_TELEPORTER_BLUE_16,
+       EL_MM_TELEPORTER_BLUE_15,
+       EL_MM_TELEPORTER_BLUE_14,
+       EL_MM_TELEPORTER_BLUE_13,
+       EL_MM_TELEPORTER_BLUE_12,
+       EL_MM_TELEPORTER_BLUE_11,
+       EL_MM_TELEPORTER_BLUE_10,
+       EL_MM_TELEPORTER_BLUE_9,
+       EL_MM_TELEPORTER_BLUE_8,
+       EL_MM_TELEPORTER_BLUE_7,
+       EL_MM_TELEPORTER_BLUE_6
       },
       {
-       EL_MM_POLARISATOR_1,
-       EL_MM_POLARISATOR_16,
-       EL_MM_POLARISATOR_15,
-       EL_MM_POLARISATOR_14,
-       EL_MM_POLARISATOR_13,
-       EL_MM_POLARISATOR_12,
-       EL_MM_POLARISATOR_11,
-       EL_MM_POLARISATOR_10,
-       EL_MM_POLARISATOR_9,
-       EL_MM_POLARISATOR_8,
-       EL_MM_POLARISATOR_7,
-       EL_MM_POLARISATOR_6,
-       EL_MM_POLARISATOR_5,
-       EL_MM_POLARISATOR_4,
-       EL_MM_POLARISATOR_3,
-       EL_MM_POLARISATOR_2
+       EL_MM_POLARIZER_1,
+       EL_MM_POLARIZER_16,
+       EL_MM_POLARIZER_15,
+       EL_MM_POLARIZER_14,
+       EL_MM_POLARIZER_13,
+       EL_MM_POLARIZER_12,
+       EL_MM_POLARIZER_11,
+       EL_MM_POLARIZER_10,
+       EL_MM_POLARIZER_9,
+       EL_MM_POLARIZER_8,
+       EL_MM_POLARIZER_7,
+       EL_MM_POLARIZER_6,
+       EL_MM_POLARIZER_5,
+       EL_MM_POLARIZER_4,
+       EL_MM_POLARIZER_3,
+       EL_MM_POLARIZER_2
       },
       {
        EL_DF_MIRROR_1,
@@ -12045,6 +12281,18 @@ void WrapLevel(int dx, int dy)
   CopyLevelToUndoBuffer(UNDO_ACCUMULATE);
 }
 
+static void CopyLevelTemplateToUserLevelSet(char *levelset_subdir)
+{
+  char *template_filename_old = getLocalLevelTemplateFilename();
+  char *template_filename_new =
+    getPath2(getUserLevelDir(levelset_subdir), LEVELTEMPLATE_FILENAME);
+
+  if (copyFile(template_filename_old, template_filename_new) != 0)
+    Request("Cannot copy level template!", REQ_CONFIRM);
+
+  free(template_filename_new);
+}
+
 static void HandleDrawingAreas(struct GadgetInfo *gi)
 {
   static boolean started_inside_drawing_area = FALSE;
@@ -12640,8 +12888,7 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
       if (UpdateUserLevelSet(levelset_subdir,
                             levelset_name,
                             levelset_author,
-                            levelset_num_levels,
-                            levelset_first_level_nr))
+                            levelset_num_levels))
       {
        Request("Level set updated!", REQ_CONFIRM);
       }
@@ -12650,14 +12897,21 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
        Request("Updating level set failed!", REQ_CONFIRM);
       }
     }
-    else
+    else if (levelset_save_mode == LEVELSET_SAVE_MODE_CREATE)
     {
+      if (level.changed && !Request("Level has changed! Discard changes?",
+                                    REQ_ASK))
+       return;
+
       if (CreateUserLevelSet(levelset_subdir,
                             levelset_name,
                             levelset_author,
                             levelset_num_levels,
-                            levelset_first_level_nr))
+                            levelset_use_levelset_artwork))
       {
+       if (levelset_copy_level_template)
+         CopyLevelTemplateToUserLevelSet(levelset_subdir);
+
        Request("New level set created!", REQ_CONFIRM);
 
        AddUserLevelSetToLevelInfo(levelset_subdir);
@@ -12878,7 +13132,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
   }
 
   /* do not mark level as modified for certain non-level-changing gadgets */
-  if ((type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST &&
+  if ((type_id >= ED_CHECKBUTTON_ID_LEVELSET_FIRST &&
+       type_id <= ED_CHECKBUTTON_ID_LEVELSET_LAST) ||
+      (type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST &&
        type_id <= ED_CHECKBUTTON_ID_EDITOR_LAST) ||
       type_id == ED_CHECKBUTTON_ID_STICK_ELEMENT)
     return;
@@ -13127,7 +13383,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
     case GADGET_ID_ZOOM:
       // zoom level editor tile size in or out (or reset to default size)
       ed_tilesize = (button == 1 ? ed_tilesize * 2 :
-                    button == 2 ? DEFAULT_EDITOR_TILESIZE :
+                    button == 2 ? ed_tilesize_default :
                     button == 3 ? ed_tilesize / 2 : ed_tilesize);
 
       // limit zoom level by upper and lower bound
@@ -13836,6 +14092,10 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
     /* draw normal door */
     UndrawSpecialEditorDoor();
 
+    // use door animation if door 1 viewport is unchanged and contains toolbox
+    if (useEditorDoorAnimation())
+      CloseDoor(DOOR_CLOSE_1 | DOOR_FORCE_ANIM);
+
     // close editor doors if viewport definition is the same as in main menu
     if (vp_door_1->x      == DX     &&
        vp_door_1->y      == DY     &&