added setting correct default editor tile size (depending on game engine)
[rocksndiamonds.git] / src / editor.c
index 2ff9fef641007fafb983cabe3f83d946db3c7c9f..702646426b6a0d5ba9a652c9d20578295366d98f 100644 (file)
 
 /* default value for element tile size in drawing area */
 #define DEFAULT_EDITOR_TILESIZE                MINI_TILESIZE
+#define DEFAULT_EDITOR_TILESIZE_MM     TILESIZE
 
 
 /*
@@ -3691,6 +3692,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)
 
@@ -3722,7 +3724,9 @@ static void ModifyEditorDrawingArea(int, int, int);
 static void ModifyEditorElementList();
 static void AdjustElementListScrollbar();
 static void RedrawDrawingElements();
+static void DrawDrawingWindowExt(boolean);
 static void DrawDrawingWindow();
+static void DrawDrawingWindow_PlayfieldOnly();
 static void DrawLevelInfoWindow();
 static void DrawPropertiesWindow();
 static void DrawPaletteWindow();
@@ -8276,12 +8280,23 @@ static int getMaxEdFieldY(boolean has_scrollbar)
 void InitZoomLevelSettings(int zoom_tilesize)
 {
   if (zoom_tilesize == -1)
-    zoom_tilesize = setup.auto_setup.editor_zoom_tilesize;
+  {
+    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;
+    }
+  }
 
   // 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);
@@ -8319,6 +8334,58 @@ 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;
@@ -8338,8 +8405,6 @@ void DrawLevelEd()
   InitZoomLevelSettings(-1);
   InitLevelSetInfo();
 
-  SetDoorState(DOOR_OPEN_1 | DOOR_OPEN_2);
-
 #if DEBUG
   CheckElementDescriptions();
 #endif
@@ -8363,28 +8428,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();
@@ -8396,16 +8439,28 @@ void DrawLevelEd()
   InitElementPropertiesGfxElement();
 
   UnmapAllGadgets();
-  MapControlButtons();
 
-  DrawEditModeWindow();
+  DrawDrawingWindow_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()
@@ -8702,7 +8757,7 @@ static void RedrawDrawingElements()
   PickDrawingElement(3, new_element3);
 }
 
-static void DrawDrawingWindow()
+static void DrawDrawingWindowExt(boolean remap_toolbox_gadgets)
 {
   stick_element_properties_window = FALSE;
 
@@ -8710,7 +8765,6 @@ static void DrawDrawingWindow()
   ClearField();
 
   UnmapLevelEditorFieldGadgets();
-  UnmapLevelEditorToolboxCustomGadgets();
 
   AdjustDrawingAreaGadgets();
   AdjustLevelScrollPosition();
@@ -8720,7 +8774,22 @@ 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 void DrawDrawingWindow_PlayfieldOnly()
+{
+  DrawDrawingWindowExt(FALSE);
 }
 
 static int getTabulatorBarWidth()
@@ -13207,7 +13276,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
@@ -13916,6 +13985,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     &&