added support for text above selectboxes (but not using it yet)
[rocksndiamonds.git] / src / editor.c
index 3b6d092d100fd86c68df092c88fe5007e571a0aa..761ff632485f8ebc44968c35d883ca5cf42e6dc0 100644 (file)
 #define ED_NUM_SELECTBOX                       29
 
 #define ED_SELECTBOX_ID_LEVEL_FIRST    ED_SELECTBOX_ID_TIME_OR_STEPS
-#define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_WIND_DIRECTION
+#define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_GAME_ENGINE_TYPE
 
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
@@ -1332,7 +1332,7 @@ static struct
     "score for each second/step left:",        NULL, NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(13),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
     0,                                 9999,
     GADGET_ID_LEVEL_RANDOM_SEED_DOWN,  GADGET_ID_LEVEL_RANDOM_SEED_UP,
     GADGET_ID_LEVEL_RANDOM_SEED_TEXT,  GADGET_ID_NONE,
@@ -2333,7 +2333,7 @@ static struct
   int size;    /* char size of selectbox or '-1' (dynamically determined) */
   struct ValueTextInfo *options;
   int *value;
-  char *text_left, *text_right, *infotext;
+  char *text_above, *text_left, *text_right, *infotext;
 } selectbox_info[ED_NUM_SELECTBOX] =
 {
   /* ---------- level and editor settings ---------------------------------- */
@@ -2344,34 +2344,34 @@ static struct
     -1,
     options_time_or_steps,
     &level.use_step_counter,
-    NULL, "(0 => no limit)",           "time or step limit"
+    NULL, NULL, "(0 => no limit)",     "time or step limit"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
     GADGET_ID_GAME_ENGINE_TYPE,                GADGET_ID_NONE,
     -1,
     options_game_engine_type,
     &level.game_engine_type,
-    "game engine:", NULL,              "game engine"
+    NULL, "game engine:", NULL,                "game engine"
   },
+
+  /* ---------- element settings: configure (several elements) ------------- */
+
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_WIND_DIRECTION,          GADGET_ID_NONE,
     -1,
     options_wind_direction,
     &level.wind_direction_initial,
-    "initial wind direction:", NULL,   "initial wind direction"
+    NULL, "initial wind direction:", NULL,     "initial wind direction"
   },
-
-  /* ---------- element settings: configure (several elements) ------------- */
-
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
     options_player_speed,
     &level.initial_player_stepsize[0],
-    "initial player speed:", NULL,     "initial player speed"
+    NULL, "initial player speed:", NULL,       "initial player speed"
   },
 
   /* ---------- element settings: configure 1 (custom elements) ------------ */
@@ -2382,7 +2382,7 @@ static struct
     -1,
     options_access_type,
     &custom_element.access_type,
-    NULL, NULL,                                "type of access to this field"
+    NULL, NULL, NULL,                  "type of access to this field"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2390,7 +2390,7 @@ static struct
     -1,
     options_access_layer,
     &custom_element.access_layer,
-    NULL, NULL,                                "layer of access for this field"
+    NULL, NULL, NULL,                  "layer of access for this field"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2398,7 +2398,7 @@ static struct
     -1,
     options_access_protected,
     &custom_element.access_protected,
-    NULL, NULL,                                "protected access for this field"
+    NULL, NULL, NULL,                  "protected access for this field"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(3),
@@ -2406,7 +2406,7 @@ static struct
     -1,
     options_access_direction,
     &custom_element.access_direction,
-    "from", NULL,                      "access direction for this field"
+    NULL, "from", NULL,                        "access direction for this field"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
@@ -2414,7 +2414,7 @@ static struct
     -1,
     options_walk_to_action,
     &custom_element.walk_to_action,
-    NULL, NULL,                                "diggable/collectible/pushable"
+    NULL, NULL, NULL,                  "diggable/collectible/pushable"
   },
 
   /* ---------- element settings: configure 2 (custom elements) ------------ */
@@ -2425,7 +2425,7 @@ static struct
     -1,
     options_move_pattern,
     &custom_element.move_pattern,
-    "can move", NULL,                  "element move pattern"
+    NULL, "can move", NULL,            "element move pattern"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2433,7 +2433,7 @@ static struct
     -1,
     options_move_direction,
     &custom_element.move_direction_initial,
-    "starts moving", NULL,             "initial element move direction"
+    NULL, "starts moving", NULL,       "initial element move direction"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
@@ -2441,7 +2441,7 @@ static struct
     -1,
     options_move_stepsize,
     &custom_element.move_stepsize,
-    "move/fall speed", NULL,           "speed of element movement"
+    NULL, "move/fall speed", NULL,     "speed of element movement"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(3),
@@ -2451,8 +2451,8 @@ static struct
     &custom_element.move_leave_type,
     // left text with leading spaces to place gadget next to "can dig" gadget
     // (needed because drawing area gadgets created after selectbox gadgets)
-    // "can dig:    can", ":",         "leave behind or change element"
-    "            can", ":",            "leave behind or change element"
+    // NULL, "can dig:    can", ":",   "leave behind or change element"
+    NULL, "            can", ":",      "leave behind or change element"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
@@ -2460,7 +2460,7 @@ static struct
     -1,
     options_smash_targets,
     &custom_element.smash_targets,
-    "can smash", NULL,                 "elements that can be smashed"
+    NULL, "can smash", NULL,           "elements that can be smashed"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(8),
@@ -2468,7 +2468,7 @@ static struct
     -1,
     options_slippery_type,
     &custom_element.slippery_type,
-    "slippery", NULL,                  "where other elements fall down"
+    NULL, "slippery", NULL,            "where other elements fall down"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(9),
@@ -2476,7 +2476,7 @@ static struct
     -1,
     options_deadliness,
     &custom_element.deadliness,
-    "deadly when", NULL,               "deadliness of element"
+    NULL, "deadly when", NULL,         "deadliness of element"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(10),
@@ -2484,7 +2484,7 @@ static struct
     -1,
     options_explosion_type,
     &custom_element.explosion_type,
-    "can explode", NULL,               "explosion type"
+    NULL, "can explode", NULL,         "explosion type"
   },
 
   /* ---------- element settings: advanced (custom elements) --------------- */
@@ -2495,7 +2495,7 @@ static struct
     -1,
     options_time_units,
     &custom_element_change.delay_frames,
-    "delay time given in", NULL,       "delay time units for change"
+    NULL, "delay time given in", NULL, "delay time units for change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(4),
@@ -2503,7 +2503,7 @@ static struct
     -1,
     options_change_direct_action,
     &custom_element_change.direct_action,
-    NULL, NULL,                                "type of direct action"
+    NULL, NULL, NULL,                  "type of direct action"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(5),
@@ -2511,7 +2511,7 @@ static struct
     -1,
     options_change_other_action,
     &custom_element_change.other_action,
-    NULL, "element:",                  "type of other element action"
+    NULL, NULL, "element:",            "type of other element action"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(6),
@@ -2519,7 +2519,7 @@ static struct
     -1,
     options_change_trigger_side,
     &custom_element_change.trigger_side,
-    "at", "side",                      "element side triggering change"
+    NULL, "at", "side",                        "element side triggering change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(7),
@@ -2527,7 +2527,7 @@ static struct
     -1,
     options_change_trigger_player,
     &custom_element_change.trigger_player,
-    "player:", " ",                    "player that causes change"
+    NULL, "player:", " ",              "player that causes change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(7),
@@ -2535,7 +2535,7 @@ static struct
     -1,
     options_change_trigger_page,
     &custom_element_change.trigger_page,
-    "page:", NULL,                     "change page that causes change"
+    NULL, "page:", NULL,               "change page that causes change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(10),
@@ -2543,7 +2543,7 @@ static struct
     -1,
     options_change_replace_when,
     &custom_element_change.replace_when,
-    "replace when", NULL,              "which elements can be replaced"
+    NULL, "replace when", NULL,                "which elements can be replaced"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
@@ -2551,7 +2551,7 @@ static struct
     -1,
     options_action_type,
     &custom_element_change.action_type,
-    NULL, NULL,                                "action on specified condition"
+    NULL, NULL, NULL,                  "action on specified condition"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
@@ -2559,7 +2559,7 @@ static struct
     -1,
     options_action_mode_none,
     &custom_element_change.action_mode,
-    NULL, NULL,                                "action operator"
+    NULL, NULL, NULL,                  "action operator"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
@@ -2567,7 +2567,7 @@ static struct
     -1,
     options_action_arg_none,
     &custom_element_change.action_arg,
-    NULL, NULL,                                "action parameter"
+    NULL, NULL, NULL,                  "action parameter"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(14),
@@ -2575,7 +2575,7 @@ static struct
     3,
     options_change_page,
     &custom_element.current_change_page,
-    NULL, NULL,                                "element change page"
+    NULL, NULL, NULL,                  "element change page"
   },
 
   /* ---------- element settings: configure (group elements) --------------- */
@@ -2586,7 +2586,7 @@ static struct
     -1,
     options_group_choice_mode,
     &group_element_info.choice_mode,
-    "choice type:", NULL,              "type of group element choice"
+    NULL, "choice type:", NULL,                "type of group element choice"
   },
 };
 
@@ -3643,6 +3643,7 @@ static void DrawPaletteWindow();
 static void UpdateCustomElementGraphicGadgets();
 static boolean checkPropertiesConfig(int);
 static void SetAutomaticNumberOfGemsNeeded();
+static void ClearEditorGadgetInfoText();
 static void CopyLevelToUndoBuffer(int);
 static void HandleDrawingAreas(struct GadgetInfo *);
 static void HandleCounterButtons(struct GadgetInfo *);
@@ -3657,6 +3658,7 @@ static void HandleControlButtons(struct GadgetInfo *);
 static void HandleDrawingAreaInfo(struct GadgetInfo *);
 static void PrintEditorGadgetInfoText(struct GadgetInfo *);
 static boolean AskToCopyAndModifyLevelTemplate();
+static boolean getDrawModeHiRes();
 
 static int num_editor_gadgets = 0;     /* dynamically determined */
 
@@ -5460,6 +5462,7 @@ static void ReinitializeElementList_EnableSections()
     setup_editor_el_more               = FALSE;
     setup_editor_el_sokoban            = FALSE;
     setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
     setup_editor_el_dx_boulderdash     = FALSE;
     setup_editor_el_mirror_magic       = FALSE;
     setup_editor_el_deflektor          = FALSE;
@@ -5658,7 +5661,7 @@ static void ReinitializeElementList()
 
 void PrintEditorElementList()
 {
-  boolean *stop = &setup.editor.el_user_defined;
+  boolean *stop = &setup_editor_el_user_defined;
   int i, j;
 
   for (i = 0; editor_elements_info[i].setup_value != stop; i++)
@@ -7111,11 +7114,17 @@ static void MapSelectboxGadget(int id)
   struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(selectbox_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
+  int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
   int yoffset = (gi->height - font_height) / 2;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
+  int y_above = gi->y - yoffset_above;
+  int x = gi->x;
   int y = gi->y + yoffset;
 
+  if (selectbox_info[id].text_above)
+    DrawText(x, y_above, selectbox_info[id].text_above, font_nr);
+
   if (selectbox_info[id].text_left)
     DrawText(x_left, y, selectbox_info[id].text_left, font_nr);
 
@@ -8147,8 +8156,16 @@ static int getMaxEdFieldY(boolean has_scrollbar)
   return max_ed_fieldy;
 }
 
-void InitZoomLevelSettings()
+void InitZoomLevelSettings(int zoom_tilesize)
 {
+  if (zoom_tilesize == -1)
+    zoom_tilesize = setup.auto_setup.editor_zoom_tilesize;
+
+  // limit zoom tilesize by upper and lower bound
+  zoom_tilesize = MIN(MAX(MICRO_TILESIZE, zoom_tilesize), TILESIZE);
+
+  ed_tilesize = setup.auto_setup.editor_zoom_tilesize = zoom_tilesize;
+
   MAX_ED_FIELDX = getMaxEdFieldX(FALSE);
   MAX_ED_FIELDY = getMaxEdFieldY(FALSE);
 }
@@ -8169,7 +8186,7 @@ void DrawLevelEd()
 
   ClearField();
 
-  InitZoomLevelSettings();
+  InitZoomLevelSettings(-1);
 
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -9105,6 +9122,10 @@ static void DrawPropertiesInfo()
 #define TEXT_CRACKING          "Score for cracking"
 #define TEXT_AMOEBA_SPEED      "Speed of amoeba growth"
 #define TEXT_DURATION          "Duration when activated"
+#define TEXT_DELAY_ON          "Delay before activating"
+#define TEXT_DELAY_OFF         "Delay before deactivating"
+#define TEXT_DELAY_EXPLODING   "Delay before exploding"
+#define TEXT_DELAY_MOVING      "Delay before moving"
 #define TEXT_BALL_DELAY                "Element generation delay"
 #define TEXT_MOVE_SPEED                "Speed of android moving"
 #define TEXT_CLONE_SPEED       "Speed of android cloning"
@@ -9186,6 +9207,15 @@ static struct
   { EL_EMC_KEY_7,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EMC_KEY_8,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_DC_KEY_WHITE,   &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_MM_KETTLE,      &level.score[SC_EMERALD],       TEXT_COLLECTING },
+  { EL_DF_CELL,                &level.score[SC_EMERALD],       TEXT_COLLECTING },
+  { EL_MM_KEY,         &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_MM_LIGHTBALL,   &level.score[SC_ELEM_BONUS],    TEXT_COLLECTING },
+  { EL_MM_PACMAN,      &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_RIGHT,        &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_UP,   &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN],        TEXT_SMASHING   },
   { EL_AMOEBA_WET,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_DRY,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_FULL,    &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
@@ -9221,10 +9251,11 @@ static struct
   { EL_SPRING,         &level.slurp_score,             TEXT_SLURPING   },
   { EL_EMC_LENSES,     &level.lenses_time,             TEXT_DURATION   },
   { EL_EMC_MAGNIFIER,  &level.magnify_time,            TEXT_DURATION   },
-#if 0
-  /* defined, but currently not used in MM engine */
-  { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse,            TEXT_DURATION   },
-#endif
+  { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse,            TEXT_DELAY_OFF  },
+  { EL_MM_BOMB,                &level.mm_time_bomb,            TEXT_DELAY_EXPLODING },
+  { EL_MM_GRAY_BALL,   &level.mm_time_ball,            TEXT_DELAY_ON   },
+  { EL_MM_STEEL_BLOCK, &level.mm_time_block,           TEXT_DELAY_MOVING },
+  { EL_MM_WOODEN_BLOCK,        &level.mm_time_block,           TEXT_DELAY_MOVING },
 
   { -1,                        NULL,                           NULL            }
 };
@@ -9236,6 +9267,7 @@ static boolean checkPropertiesConfig(int element)
   if (IS_GEM(element) ||
       IS_CUSTOM_ELEMENT(element) ||
       IS_GROUP_ELEMENT(element) ||
+      IS_BALLOON_ELEMENT(element) ||
       IS_ENVELOPE(element) ||
       IS_MM_MCDUFFIN(element) ||
       IS_DF_LASER(element) ||
@@ -9449,7 +9481,8 @@ static void DrawPropertiesConfig()
       ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0);
     checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
       ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
-                      HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
+                              IS_BALLOON_ELEMENT(properties_element) ||
+                              HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
   }
@@ -9476,6 +9509,9 @@ static void DrawPropertiesConfig()
       properties_element == EL_SOKOBAN_FIELD_FULL)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN);
 
+  if (IS_BALLOON_ELEMENT(properties_element))
+    MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION);
+
   if (IS_ENVELOPE(properties_element))
   {
     int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
@@ -10268,7 +10304,8 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
   int sx = x - level_xpos;
   int sy = y - level_ypos;
   int old_element = Feld[x][y];
-  unsigned int new_bitmask = (dx + 1) << (dy * 2);
+  int new_element = element;
+  unsigned int new_bitmask = (getDrawModeHiRes() ? (dx + 1) << (dy * 2) : 0x0f);
   boolean draw_masked = FALSE;
 
   if (IS_MM_WALL_EDITOR(element))
@@ -10296,7 +10333,9 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
 
   if (IN_ED_FIELD(sx, sy))
   {
-    if (draw_masked)
+    if (IS_MM_WALL(old_element) && new_element == EL_EMPTY)
+      DrawSizedWallParts_MM(sx, sy, EL_EMPTY, ed_tilesize, FALSE, new_bitmask);
+    else if (draw_masked)
       DrawEditorElementThruMask(sx, sy, element);
     else
       DrawEditorElement(sx, sy, element);
@@ -10679,10 +10718,14 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
       { EL_EM_EXIT_CLOSED,             EL_EM_EXIT_OPEN                 },
       { EL_EM_STEEL_EXIT_CLOSED,       EL_EM_STEEL_EXIT_OPEN           },
       { EL_QUICKSAND_FAST_EMPTY,       EL_QUICKSAND_FAST_FULL          },
+      { EL_MM_EXIT_CLOSED,             EL_MM_EXIT_OPEN                 },
+      { EL_MM_FUSE,                    EL_MM_FUSE_ACTIVE               },
+      { EL_MM_LIGHTBULB,               EL_MM_LIGHTBULB_ACTIVE          },
+      { EL_MM_FUEL_EMPTY,              EL_MM_FUEL_FULL                 },
 
       { -1,                            -1                              },
     };
-    static int rotatable_elements[][4] =
+    static int rotatable_elements_4[][4] =
     {
       {
        EL_BUG_UP,
@@ -10690,95 +10733,344 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
        EL_BUG_DOWN,
        EL_BUG_LEFT
       },
-
       {
        EL_SPACESHIP_UP,
        EL_SPACESHIP_RIGHT,
        EL_SPACESHIP_DOWN,
        EL_SPACESHIP_LEFT
       },
-
       {
        EL_BD_BUTTERFLY_UP,
        EL_BD_BUTTERFLY_RIGHT,
        EL_BD_BUTTERFLY_DOWN,
        EL_BD_BUTTERFLY_LEFT
       },
-
       {
        EL_BD_FIREFLY_UP,
        EL_BD_FIREFLY_RIGHT,
        EL_BD_FIREFLY_DOWN,
        EL_BD_FIREFLY_LEFT
       },
-
       {
        EL_PACMAN_UP,
        EL_PACMAN_RIGHT,
        EL_PACMAN_DOWN,
        EL_PACMAN_LEFT
       },
-
       {
        EL_YAMYAM_UP,
        EL_YAMYAM_RIGHT,
        EL_YAMYAM_DOWN,
        EL_YAMYAM_LEFT
       },
-
       {
        EL_ARROW_UP,
        EL_ARROW_RIGHT,
        EL_ARROW_DOWN,
        EL_ARROW_LEFT
       },
-
       {
        EL_SP_PORT_UP,
        EL_SP_PORT_RIGHT,
        EL_SP_PORT_DOWN,
        EL_SP_PORT_LEFT
       },
-
       {
        EL_SP_GRAVITY_PORT_UP,
        EL_SP_GRAVITY_PORT_RIGHT,
        EL_SP_GRAVITY_PORT_DOWN,
        EL_SP_GRAVITY_PORT_LEFT
       },
-
       {
        EL_SP_GRAVITY_ON_PORT_UP,
        EL_SP_GRAVITY_ON_PORT_RIGHT,
        EL_SP_GRAVITY_ON_PORT_DOWN,
        EL_SP_GRAVITY_ON_PORT_LEFT
       },
-
       {
        EL_SP_GRAVITY_OFF_PORT_UP,
        EL_SP_GRAVITY_OFF_PORT_RIGHT,
        EL_SP_GRAVITY_OFF_PORT_DOWN,
        EL_SP_GRAVITY_OFF_PORT_LEFT
       },
-
       {
        EL_MOLE_UP,
        EL_MOLE_RIGHT,
        EL_MOLE_DOWN,
        EL_MOLE_LEFT
       },
-
       {
        EL_BALLOON_SWITCH_UP,
        EL_BALLOON_SWITCH_RIGHT,
        EL_BALLOON_SWITCH_DOWN,
        EL_BALLOON_SWITCH_LEFT
       },
+      {
+       EL_MM_MCDUFFIN_UP,
+       EL_MM_MCDUFFIN_RIGHT,
+       EL_MM_MCDUFFIN_DOWN,
+       EL_MM_MCDUFFIN_LEFT
+      },
+      {
+       EL_MM_MIRROR_FIXED_1,
+       EL_MM_MIRROR_FIXED_4,
+       EL_MM_MIRROR_FIXED_3,
+       EL_MM_MIRROR_FIXED_2
+      },
+      {
+       EL_MM_STEEL_GRID_FIXED_1,
+       EL_MM_STEEL_GRID_FIXED_4,
+       EL_MM_STEEL_GRID_FIXED_2,
+       EL_MM_STEEL_GRID_FIXED_3
+      },
+      {
+       EL_MM_WOODEN_GRID_FIXED_1,
+       EL_MM_WOODEN_GRID_FIXED_4,
+       EL_MM_WOODEN_GRID_FIXED_2,
+       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_PACMAN_UP,
+       EL_MM_PACMAN_RIGHT,
+       EL_MM_PACMAN_DOWN,
+       EL_MM_PACMAN_LEFT
+      },
+      {
+       EL_DF_LASER_UP,
+       EL_DF_LASER_RIGHT,
+       EL_DF_LASER_DOWN,
+       EL_DF_LASER_LEFT
+      },
+      {
+       EL_DF_RECEIVER_UP,
+       EL_DF_RECEIVER_RIGHT,
+       EL_DF_RECEIVER_DOWN,
+       EL_DF_RECEIVER_LEFT
+      },
 
       {
        -1,
+      },
+    };
+    static int rotatable_elements_8[][8] =
+    {
+      {
+       EL_DF_STEEL_GRID_FIXED_1,
+       EL_DF_STEEL_GRID_FIXED_8,
+       EL_DF_STEEL_GRID_FIXED_7,
+       EL_DF_STEEL_GRID_FIXED_6,
+       EL_DF_STEEL_GRID_FIXED_5,
+       EL_DF_STEEL_GRID_FIXED_4,
+       EL_DF_STEEL_GRID_FIXED_3,
+       EL_DF_STEEL_GRID_FIXED_2
+      },
+      {
+       EL_DF_WOODEN_GRID_FIXED_1,
+       EL_DF_WOODEN_GRID_FIXED_8,
+       EL_DF_WOODEN_GRID_FIXED_7,
+       EL_DF_WOODEN_GRID_FIXED_6,
+       EL_DF_WOODEN_GRID_FIXED_5,
+       EL_DF_WOODEN_GRID_FIXED_4,
+       EL_DF_WOODEN_GRID_FIXED_3,
+       EL_DF_WOODEN_GRID_FIXED_2
+      },
+      {
+       EL_DF_STEEL_GRID_ROTATING_1,
+       EL_DF_STEEL_GRID_ROTATING_8,
+       EL_DF_STEEL_GRID_ROTATING_7,
+       EL_DF_STEEL_GRID_ROTATING_6,
+       EL_DF_STEEL_GRID_ROTATING_5,
+       EL_DF_STEEL_GRID_ROTATING_4,
+       EL_DF_STEEL_GRID_ROTATING_3,
+       EL_DF_STEEL_GRID_ROTATING_2
+      },
+      {
+       EL_DF_WOODEN_GRID_ROTATING_1,
+       EL_DF_WOODEN_GRID_ROTATING_8,
+       EL_DF_WOODEN_GRID_ROTATING_7,
+       EL_DF_WOODEN_GRID_ROTATING_6,
+       EL_DF_WOODEN_GRID_ROTATING_5,
+       EL_DF_WOODEN_GRID_ROTATING_4,
+       EL_DF_WOODEN_GRID_ROTATING_3,
+       EL_DF_WOODEN_GRID_ROTATING_2
+      },
+
+      {
        -1,
-       -1,
+      },
+    };
+    static int rotatable_elements_16[][16] =
+    {
+      {
+       EL_MM_MIRROR_1,
+       EL_MM_MIRROR_16,
+       EL_MM_MIRROR_15,
+       EL_MM_MIRROR_14,
+       EL_MM_MIRROR_13,
+       EL_MM_MIRROR_12,
+       EL_MM_MIRROR_11,
+       EL_MM_MIRROR_10,
+       EL_MM_MIRROR_9,
+       EL_MM_MIRROR_8,
+       EL_MM_MIRROR_7,
+       EL_MM_MIRROR_6,
+       EL_MM_MIRROR_5,
+       EL_MM_MIRROR_4,
+       EL_MM_MIRROR_3,
+       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_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_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_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_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_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_DF_MIRROR_1,
+       EL_DF_MIRROR_16,
+       EL_DF_MIRROR_15,
+       EL_DF_MIRROR_14,
+       EL_DF_MIRROR_13,
+       EL_DF_MIRROR_12,
+       EL_DF_MIRROR_11,
+       EL_DF_MIRROR_10,
+       EL_DF_MIRROR_9,
+       EL_DF_MIRROR_8,
+       EL_DF_MIRROR_7,
+       EL_DF_MIRROR_6,
+       EL_DF_MIRROR_5,
+       EL_DF_MIRROR_4,
+       EL_DF_MIRROR_3,
+       EL_DF_MIRROR_2
+      },
+      {
+       EL_DF_MIRROR_ROTATING_1,
+       EL_DF_MIRROR_ROTATING_16,
+       EL_DF_MIRROR_ROTATING_15,
+       EL_DF_MIRROR_ROTATING_14,
+       EL_DF_MIRROR_ROTATING_13,
+       EL_DF_MIRROR_ROTATING_12,
+       EL_DF_MIRROR_ROTATING_11,
+       EL_DF_MIRROR_ROTATING_10,
+       EL_DF_MIRROR_ROTATING_9,
+       EL_DF_MIRROR_ROTATING_8,
+       EL_DF_MIRROR_ROTATING_7,
+       EL_DF_MIRROR_ROTATING_6,
+       EL_DF_MIRROR_ROTATING_5,
+       EL_DF_MIRROR_ROTATING_4,
+       EL_DF_MIRROR_ROTATING_3,
+       EL_DF_MIRROR_ROTATING_2
+      },
+
+      {
        -1,
       },
     };
@@ -10793,19 +11085,61 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
        new_element = (old_element == element1 ? element2 : element1);
     }
 
-    for (i = 0; rotatable_elements[i][0] != -1; i++)
+    for (i = 0; rotatable_elements_4[i][0] != -1; i++)
     {
       for (j = 0; j < 4; j++)
       {
-       int element = rotatable_elements[i][j];
+       int element = rotatable_elements_4[i][j];
 
        if (old_element == element)
-         new_element = (button == 1 ? rotatable_elements[i][(j + 3) % 4] :
-                        button == 2 ? rotatable_elements[i][0]           :
-                        button == 3 ? rotatable_elements[i][(j + 1) % 4] :
+         new_element = (button == 1 ? rotatable_elements_4[i][(j + 3) % 4] :
+                        button == 2 ? rotatable_elements_4[i][0]           :
+                        button == 3 ? rotatable_elements_4[i][(j + 1) % 4] :
                         old_element);
       }
     }
+
+    for (i = 0; rotatable_elements_8[i][0] != -1; i++)
+    {
+      for (j = 0; j < 8; j++)
+      {
+       int element = rotatable_elements_8[i][j];
+
+       if (old_element == element)
+         new_element = (button == 1 ? rotatable_elements_8[i][(j + 7) % 8] :
+                        button == 2 ? rotatable_elements_8[i][0]           :
+                        button == 3 ? rotatable_elements_8[i][(j + 1) % 8] :
+                        old_element);
+      }
+    }
+
+    for (i = 0; rotatable_elements_16[i][0] != -1; i++)
+    {
+      for (j = 0; j < 16; j++)
+      {
+       int element = rotatable_elements_16[i][j];
+
+       if (old_element == element)
+         new_element = (button == 1 ? rotatable_elements_16[i][(j + 15) % 16] :
+                        button == 2 ? rotatable_elements_16[i][0]             :
+                        button == 3 ? rotatable_elements_16[i][(j + 1)  % 16] :
+                        old_element);
+      }
+    }
+
+    if (old_element != new_element)
+    {
+      int max_infotext_len = getMaxInfoTextLength();
+      char infotext[MAX_OUTPUT_LINESIZE + 1];
+
+      strncpy(infotext, getElementInfoText(new_element), max_infotext_len);
+      infotext[max_infotext_len] = '\0';
+
+      ClearEditorGadgetInfoText();
+
+      DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, INFOTEXT_FONT,
+               infotext);
+    }
   }
 
   SetElementSimple(x, y, new_element, change_level);
@@ -10825,6 +11159,30 @@ static void ResetIntelliDraw()
   SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
 }
 
+static boolean draw_mode_hires = FALSE;
+
+static void SetDrawModeHiRes(int element)
+{
+  draw_mode_hires =
+    (level.game_engine_type == GAME_ENGINE_TYPE_MM &&
+     (IS_MM_WALL_EDITOR(element) || element == EL_EMPTY));
+}
+
+static boolean getDrawModeHiRes()
+{
+  return draw_mode_hires;
+}
+
+static int getLoResScreenPos(int pos)
+{
+  return (getDrawModeHiRes() ? pos / 2 : pos);
+}
+
+static int getLoResScreenMod(int pos)
+{
+  return (getDrawModeHiRes() ? pos % 2 : 0);
+}
+
 static void SetElementExt(int x, int y, int dx, int dy, int element,
                          boolean change_level, int button)
 {
@@ -10849,10 +11207,10 @@ static void SetElementButton(int x, int y, int dx, int dy, int element,
 
 static void SetElementHiRes(int sx2, int sy2, int element, boolean change_level)
 {
-  int lx = sx2 / 2 + level_xpos;
-  int ly = sy2 / 2 + level_ypos;
-  int dx = sx2 % 2;
-  int dy = sy2 % 2;
+  int lx = getLoResScreenPos(sx2) + level_xpos;
+  int ly = getLoResScreenPos(sy2) + level_ypos;
+  int dx = getLoResScreenMod(sx2);
+  int dy = getLoResScreenMod(sy2);
 
   SetElementExt(lx, ly, dx, dy, element, change_level, -1);
 }
@@ -10887,9 +11245,9 @@ static int getLevelElementHiRes(int lx2, int ly2)
   return element;
 }
 
-static void DrawLineElement(int sx2, int sy2, int element, boolean change_level)
+static void DrawLineElement(int x, int y, int element, boolean change_level)
 {
-  SetElementHiRes(sx2, sy2, element, change_level);
+  SetElementHiRes(x, y, element, change_level);
 }
 
 static void DrawLine(int from_x, int from_y, int to_x, int to_y,
@@ -10977,31 +11335,35 @@ static void DrawArcExt(int from_x, int from_y, int to_x2, int to_y2,
 
   for (x = 0; x <= radius; x++)
   {
-    int sx2, sy2, lx, ly;
+    int sx, sy, sx2, sy2, lx, ly;
 
     y = (int)(sqrt((float)(radius * radius - x * x)) + 0.5);
 
     sx2 = from_x + x * (from_x < to_x2 ? +1 : -1);
     sy2 = from_y + y * (from_y < to_y2 ? +1 : -1);
-    lx = sx2 / 2 + level_xpos;
-    ly = sy2 / 2 + level_ypos;
+    sx = getLoResScreenPos(sx2);
+    sy = getLoResScreenPos(sy2);
+    lx = sx + level_xpos;
+    ly = sy + level_ypos;
 
-    if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly))
+    if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
       DrawLineElement(sx2, sy2, element, change_level);
   }
 
   for (y = 0; y <= radius; y++)
   {
-    int sx2, sy2, lx, ly;
+    int sx, sy, sx2, sy2, lx, ly;
 
     x = (int)(sqrt((float)(radius * radius - y * y)) + 0.5);
 
     sx2 = from_x + x * (from_x < to_x2 ? +1 : -1);
     sy2 = from_y + y * (from_y < to_y2 ? +1 : -1);
-    lx = sx2 / 2 + level_xpos;
-    ly = sy2 / 2 + level_ypos;
+    sx = getLoResScreenPos(sx2);
+    sy = getLoResScreenPos(sy2);
+    lx = sx + level_xpos;
+    ly = sy + level_ypos;
 
-    if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly))
+    if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
       DrawLineElement(sx2, sy2, element, change_level);
   }
 }
@@ -11063,7 +11425,7 @@ static void DrawAreaBorder(int from_x, int from_y, int to_x, int to_y)
 static void DrawAreaBox(int from_x, int from_y, int to_x, int to_y,
                        int element, boolean change_level)
 {
-  DrawBox(from_x * 2, from_y * 2, to_x * 2, to_y * 2, element, change_level);
+  DrawBox(from_x, from_y, to_x, to_y, element, change_level);
 }
 
 static void SelectArea(int from_x, int from_y, int to_x, int to_y,
@@ -11085,7 +11447,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
 
 static void DrawBrushElement(int sx, int sy, int element, boolean change_level)
 {
-  DrawLineElement(sx * 2, sy * 2, element, change_level);
+  DrawLineElement(sx, sy, element, change_level);
 }
 
 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
@@ -11604,13 +11966,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   /* also correct MM wall-sized (double) drawing area positions accordingly */
   if (sx2 / 2 < sx || sx2 / 2 > sx)
   {
-    sx2 = sx * 2;
     dx = (sx2 / 2 < sx ? 0 : 1);
+    sx2 = sx * 2 + dx;
   }
   if (sy2 / 2 < sy || sy2 / 2 > sy)
   {
-    sy2 = sy * 2;
     dy = (sy2 / 2 < sy ? 0 : 1);
+    sy2 = sy * 2 + dy;
   }
 
   if (button_release_event)
@@ -11667,6 +12029,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       ResetIntelliDraw();
   }
 
+  SetDrawModeHiRes(-1);                /* reset to normal draw mode */
+
   switch (actual_drawing_function)
   {
     case GADGET_ID_SINGLE_ITEMS:
@@ -11690,6 +12054,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        }
        else
        {
+         SetDrawModeHiRes(new_element);
+
          if (new_element == EL_PLAYER_1)
          {
            /* remove player at old position */
@@ -11743,8 +12109,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
 
        if (button)
        {
-         sx = sx2;
-         sy = sy2;
+         SetDrawModeHiRes(new_element);
+
+         if (getDrawModeHiRes())
+         {
+           sx = sx2;
+           sy = sy2;
+         }
 
          if (!button_press_event)
            DrawLine(last_sx, last_sy, sx, sy, new_element, TRUE);
@@ -11759,8 +12130,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
     case GADGET_ID_ARC:
     case GADGET_ID_RECTANGLE:
     case GADGET_ID_FILLED_BOX:
-      sx = sx2;
-      sy = sy2;
+      SetDrawModeHiRes(new_element);
+
+      if (getDrawModeHiRes())
+      {
+       sx = sx2;
+       sy = sy2;
+      }
       /* FALLTHROUGH */
     case GADGET_ID_GRAB_BRUSH:
     case GADGET_ID_TEXT:
@@ -11854,6 +12230,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   /* do not mark level as modified for certain non-level-changing gadgets */
   if ((type_id >= ED_DRAWING_ID_EDITOR_FIRST &&
        type_id <= ED_DRAWING_ID_EDITOR_LAST) ||
+      actual_drawing_function == GADGET_ID_GRAB_BRUSH ||
       actual_drawing_function == GADGET_ID_PICK_ELEMENT)
     return;
 
@@ -12030,8 +12407,6 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     }
 
     CopyElementPropertiesToGame(properties_element);
-
-    level.changed = TRUE;
   }
   else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
   {
@@ -12039,6 +12414,12 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     ReinitializeElementList();
     ModifyEditorElementList();
   }
+
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE)
+    return;
+
+  level.changed = TRUE;
 }
 
 static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
@@ -12545,7 +12926,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       // limit zoom level by upper and lower bound
       ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE);
 
-      InitZoomLevelSettings();
+      InitZoomLevelSettings(ed_tilesize);
 
       if (edit_mode == ED_MODE_DRAWING)
       {
@@ -12555,6 +12936,9 @@ static void HandleControlButtons(struct GadgetInfo *gi)
        PrintEditorGadgetInfoText(level_editor_gadget[id]);
       }
 
+      /* save current editor zoom tilesize */
+      SaveSetup_AutoSetup();
+
       break;
 
     case GADGET_ID_CUSTOM_COPY_FROM:
@@ -12644,8 +13028,8 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       if (edit_mode != ED_MODE_DRAWING)
        ChangeEditModeWindow(ED_MODE_DRAWING);
 
-      for (x = 0; x < MAX_LEV_FIELDX; x++) 
-       for (y = 0; y < MAX_LEV_FIELDY; y++) 
+      for (x = 0; x < MAX_LEV_FIELDX; x++)
+       for (y = 0; y < MAX_LEV_FIELDY; y++)
          Feld[x][y] = (button == 1 ? EL_EMPTY : new_element);
 
       CopyLevelToUndoBuffer(GADGET_ID_CLEAR);
@@ -13013,7 +13397,7 @@ void HandleLevelEditorIdle()
   FrameCounter++;      /* increase animation frame counter */
 }
 
-void ClearEditorGadgetInfoText()
+static void ClearEditorGadgetInfoText()
 {
   DrawBackground(INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE);
 }