fixed bug with mis-using image config option '.tile_size' for screen output
[rocksndiamonds.git] / src / editor.c
index 632810d3f2b3fd854475aeb5e39cb12177983d3e..828ebd7fd9987128d896279f0636d60d51720582 100644 (file)
@@ -69,7 +69,6 @@
 #define ED_GADGET_TINY_DISTANCE                (editor.gadget.tiny_spacing)
 #define ED_GADGET_LINE_DISTANCE                (editor.gadget.line_spacing)
 #define ED_GADGET_TEXT_DISTANCE                (editor.gadget.text_spacing)
-#define ED_GADGET_TAB_DISTANCE         (editor.gadget.tab_spacing)
 #define ED_TAB_BAR_HEIGHT              (editor.gadget.separator_line.height)
 #define ED_DRAWINGAREA_TEXT_DISTANCE   (ED_GADGET_TEXT_DISTANCE +      \
                                         ED_DRAWINGAREA_BORDER_SIZE)
@@ -80,7 +79,7 @@
 #define IMG_BORDER_2                   IMG_EDITOR_ELEMENT_BORDER_INPUT
 #define ED_ELEMENT_BORDER              (graphic_info[IMG_BORDER_1].border_size)
 #define ED_DRAWINGAREA_BORDER_SIZE     (graphic_info[IMG_BORDER_2].border_size)
-#define ED_DRAWINGAREA_TILE_SIZE       (graphic_info[IMG_BORDER_2].tile_size)
+#define ED_DRAWINGAREA_TILE_SIZE       (editor.drawingarea.tile_size)
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_XSIZE        (graphic_info[IMG_EDITOR_CHECKBOX].width)
 #define ED_TABBUTTON_XSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].width)
 #define ED_TABBUTTON_YSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].height)
 
-#define ED_LEVEL_SETTINGS_TABS_XPOS    (editor.level_settings.tabs.x)
-#define ED_LEVEL_SETTINGS_TABS_YPOS    (editor.level_settings.tabs.y)
-#define ED_ELEMENT_SETTINGS_TABS_XPOS  (editor.element_settings.tabs.x)
-#define ED_ELEMENT_SETTINGS_TABS_YPOS  (editor.element_settings.tabs.y)
+#define ED_LEVEL_SETTINGS_TABS_X       (editor.settings.tabs.x)
+#define ED_LEVEL_SETTINGS_TABS_Y       (editor.settings.tabs.y)
+#define ED_ELEMENT_SETTINGS_TABS_X     (editor.settings.tabs.x)
+#define ED_ELEMENT_SETTINGS_TABS_Y     (editor.settings.tabs.y +       \
+                                        editor.settings.tabs.yoffset2)
 
-#define ED_LEVEL_SETTINGS_XSTART       (ED_LEVEL_SETTINGS_TABS_XPOS)
-#define ED_LEVEL_SETTINGS_YSTART       (ED_LEVEL_SETTINGS_TABS_YPOS +  \
+#define ED_SETTINGS_TABS_XOFFSET       (editor.settings.tabs.draw_xoffset)
+#define ED_SETTINGS_TABS_YOFFSET       (editor.settings.tabs.draw_yoffset)
+
+#define ED_LEVEL_SETTINGS_XSTART       (ED_LEVEL_SETTINGS_TABS_X +     \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_LEVEL_SETTINGS_YSTART       (ED_LEVEL_SETTINGS_TABS_Y +     \
                                         ED_TABBUTTON_YSIZE +           \
                                         ED_GADGET_TINY_DISTANCE +      \
                                         ED_TAB_BAR_HEIGHT +            \
-                                        ED_GADGET_TAB_DISTANCE +       \
+                                        ED_SETTINGS_TABS_YOFFSET +     \
                                         getFontHeight(FONT_TEXT_1) +   \
                                         ED_GADGET_TEXT_DISTANCE)
-#define ED_ELEMENT_SETTINGS_XSTART     (ED_ELEMENT_SETTINGS_TABS_XPOS)
-#define ED_ELEMENT_SETTINGS_YSTART     (ED_ELEMENT_SETTINGS_TABS_YPOS + \
+#define ED_ELEMENT_SETTINGS_XSTART     (ED_ELEMENT_SETTINGS_TABS_X +   \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_ELEMENT_SETTINGS_YSTART     (ED_ELEMENT_SETTINGS_TABS_Y +   \
                                         ED_TABBUTTON_YSIZE +           \
                                         ED_GADGET_TINY_DISTANCE +      \
                                         ED_TAB_BAR_HEIGHT +            \
-                                        ED_GADGET_TAB_DISTANCE)
+                                        ED_SETTINGS_TABS_YOFFSET)
 
 #define ED_SETTINGS_XOFFSET            (ED_CHECKBUTTON_XSIZE +         \
                                         ED_GADGET_TEXT_DISTANCE)
                                         ED_POS_TO_ELEMENT_SETTINGS_Y(n) : (n))
 
 #define ED_TAB_SETTINGS_X(n)           (IS_POS_LEVEL_SETTINGS(n) ?     \
-                                        ED_LEVEL_SETTINGS_TABS_XPOS :  \
-                                        ED_ELEMENT_SETTINGS_TABS_XPOS)
+                                        ED_LEVEL_SETTINGS_TABS_X :     \
+                                        ED_ELEMENT_SETTINGS_TABS_X)
 #define ED_TAB_SETTINGS_Y(n)           (IS_POS_LEVEL_SETTINGS(n) ?     \
-                                        ED_LEVEL_SETTINGS_TABS_YPOS :  \
-                                        ED_ELEMENT_SETTINGS_TABS_YPOS)
+                                        ED_LEVEL_SETTINGS_TABS_Y :     \
+                                        ED_ELEMENT_SETTINGS_TABS_Y)
 
 #define ED_SETTINGS_XOFF(n)            (5 * ((n) % 4) *                \
                                         ED_DRAWINGAREA_TILE_SIZE)
@@ -1050,7 +1055,7 @@ static struct
   {
     IMG_EDITOR_BUTTON_GFX_ZOOM_LEVEL,          GADGET_ID_ZOOM,
     &editor.button.zoom_level,                 GD_TYPE_NORMAL_BUTTON,
-    "zoom level tile size",                    '-'
+    "zoom level tile size",                    '+'
   },
   {
     IMG_EDITOR_BUTTON_GFX_ROTATE_RIGHT,                GADGET_ID_WRAP_RIGHT,
@@ -3419,10 +3424,6 @@ static int new_element3 = EL_SAND;
 #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \
                                (button) == 2 ? new_element2 : \
                                (button) == 3 ? new_element3 : EL_EMPTY)
-#define BUTTON_STEPSIZE(button) ((button) == 1 ?  1 : \
-                                (button) == 2 ?  5 : \
-                                (button) == 3 ? 10 : \
-                                (button))
 
 /* forward declaration for internal use */
 static void ModifyEditorCounterValue(int, int);
@@ -5216,9 +5217,9 @@ void PrintEditorElementList()
       int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element);
       char *headline = element_info[cascade_element_show].editor_description;
 
-      printf_line_with_prefix("# ", "-", 77);
-      printf("# %s\n", headline);
-      printf_line_with_prefix("# ", "-", 77);
+      PrintLineWithPrefix("# ", "-", 77);
+      Print("# %s\n", headline);
+      PrintLineWithPrefix("# ", "-", 77);
     }
 
     for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
@@ -5228,21 +5229,21 @@ void PrintEditorElementList()
       if (IS_EDITOR_CASCADE(element))
        element = EL_CHAR_MINUS;
 
-      printf("# %s\n", element_info[element].token_name);
+      Print("# %s\n", element_info[element].token_name);
     }
 
     if (j > 0)
-      printf("#\n");
+      Print("#\n");
 
     for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
     {
       int element = (*editor_elements_info[i].element_list)[j];
 
-      printf("# %s\n", element_info[element].token_name);
+      Print("# %s\n", element_info[element].token_name);
     }
 
     if (j > 0)
-      printf("#\n");
+      Print("#\n");
   }
 }
 
@@ -5844,8 +5845,12 @@ static void CreateTextInputGadgets()
       int xoffset = element_border + TILEX + element_border + 3 * border_size;
       int yoffset = element_border + (TILEY - font_height) / 2;
 
-      x = editor.element_settings.element.x + xoffset - border_size;
-      y = editor.element_settings.element.y + yoffset - border_size;
+      x = (editor.settings.element_name.x != -1 ?
+          editor.settings.element_name.x :
+          editor.settings.element_graphic.x + xoffset) - border_size;
+      y = (editor.settings.element_name.y != -1 ?
+          editor.settings.element_name.y :
+          editor.settings.element_graphic.y + yoffset) - border_size;
     }
     else
     {
@@ -7607,25 +7612,23 @@ void InitZoomLevelSettings()
   MAX_ED_FIELDY = getMaxEdFieldY(FALSE);
 }
 
-static boolean playfield_area_changed = FALSE;
-
 void DrawLevelEd()
 {
-  StopAnimation();
+  int fade_mask = REDRAW_FIELD;
 
   CloseDoor(DOOR_CLOSE_ALL);
 
-  FadeOut(REDRAW_FIELD);
-
-  /* needed after playing if editor playfield area has different size */
-  ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
-
   /* needed if different viewport properties defined for editor */
   ChangeViewportPropertiesIfNeeded();
 
-  InitZoomLevelSettings();
+  if (CheckIfGlobalBorderHasChanged())
+    fade_mask = REDRAW_ALL;
+
+  FadeOut(fade_mask);
 
-  playfield_area_changed = DrawingAreaChanged();
+  ClearField();
+
+  InitZoomLevelSettings();
 
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -7685,7 +7688,9 @@ void DrawLevelEd()
 
   DrawEditModeWindow();
 
-  FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+  DrawMaskedBorder(fade_mask);
+
+  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);
@@ -8107,7 +8112,7 @@ static void DrawLevelInfoWindow()
 {
   char *text = "Global Settings";
   int font_nr = FONT_TITLE_1;
-  struct MenuPosInfo *pos = &editor.level_settings.headline;
+  struct MenuPosInfo *pos = &editor.settings.headline;
   int sx = SX + ALIGNED_XPOS(pos->x, getTextWidth(text, font_nr), pos->align);
   int sy = SY + pos->y;
 
@@ -8972,7 +8977,7 @@ static void DrawPropertiesConfig()
     if (tab_color != BLACK_PIXEL)              /* black => transparent */
       FillRectangle(drawto,
                    SX + ED_ELEMENT_SETTINGS_X(0),
-                   SY + ED_ELEMENT_SETTINGS_Y(14) - ED_GADGET_TAB_DISTANCE -
+                   SY + ED_ELEMENT_SETTINGS_Y(14) - ED_SETTINGS_TABS_YOFFSET -
                    ED_TAB_BAR_HEIGHT,
                    getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
   }
@@ -9093,13 +9098,17 @@ static void DrawPropertiesWindow()
   int border_size = gd->border_size;
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
-  int x = editor.element_settings.element.x + element_border;
-  int y = editor.element_settings.element.y + element_border;
   int xoffset = TILEX + element_border + 3 * border_size;
   int yoffset = (TILEY - font_height) / 2;
+  int x1 = editor.settings.element_graphic.x + element_border;
+  int y1 = editor.settings.element_graphic.y + element_border;
+  int x2 = (editor.settings.element_name.x == -1 ? x1 + xoffset :
+           editor.settings.element_name.x);
+  int y2 = (editor.settings.element_name.y == -1 ? y1 + yoffset :
+           editor.settings.element_name.y);
   char *text = "Element Settings";
   int font2_nr = FONT_TITLE_1;
-  struct MenuPosInfo *pos = &editor.element_settings.headline;
+  struct MenuPosInfo *pos = &editor.settings.headline;
   int sx = SX + ALIGNED_XPOS(pos->x, getTextWidth(text, font2_nr), pos->align);
   int sy = SY + pos->y;
 
@@ -9137,9 +9146,9 @@ static void DrawPropertiesWindow()
 
   FrameCounter = 0;    /* restart animation frame counter */
 
-  DrawElementBorder(SX + x, SY + y, TILEX, TILEY, FALSE);
-  DrawEditorElementAnimation(SX + x, SY + y);
-  DrawEditorElementName(x + xoffset, y + yoffset, font_nr);
+  DrawElementBorder(SX + x1, SY + y1, TILEX, TILEY, FALSE);
+  DrawEditorElementAnimation(SX + x1, SY + y1);
+  DrawEditorElementName(x2, y2, font_nr);
 
   DrawPropertiesTabulatorGadgets();
 
@@ -10912,7 +10921,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
          DrawFixedGraphicExt(drawto,
                              gi->x + sx * TILEX,
                              gi->y + sy * TILEY,
-                             el2img(new_element), 0);
+                             el2edimg(new_element), 0);
 
        if (id == GADGET_ID_CUSTOM_GRAPHIC)
          new_element = GFX_ELEMENT(new_element);
@@ -11974,12 +11983,12 @@ void HandleLevelEditorKeyInput(Key key)
       ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button);
     else if (letter == 'U')
       ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], 3);
-    else if (key == KSYM_KP_Subtract)
-      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1);
+    else if (key == KSYM_KP_Subtract || letter == '-')
+      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 3);
     else if (key == KSYM_KP_0 || letter == '0')
       ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 2);
-    else if (key == KSYM_KP_Add || letter == '+')
-      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 3);
+    else if (key == KSYM_KP_Add)
+      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1);
     else if (key == KSYM_Return ||
             key == KSYM_space ||
             key == setup.shortcut.toggle_pause)
@@ -11995,8 +12004,8 @@ void HandleLevelEditorKeyInput(Key key)
 void HandleLevelEditorIdle()
 {
   int element_border = graphic_info[IMG_EDITOR_ELEMENT_BORDER].border_size;
-  int x = editor.element_settings.element.x + element_border;
-  int y = editor.element_settings.element.y + element_border;
+  int x = editor.settings.element_graphic.x + element_border;
+  int y = editor.settings.element_graphic.y + element_border;
   static unsigned int action_delay = 0;
   unsigned int action_delay_value = GameFrameDelay;
   int i;
@@ -12255,7 +12264,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
 
     game_status = GAME_MODE_MAIN;
 
-    DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+    DrawMainMenu();
   }
   else
   {