updated contact info in source file headers
[rocksndiamonds.git] / src / editor.c
index 2791934f678473d79b61c34a90eb875565adf6dc..9ce3bd5b1369f4b622be84da24beb02da8af7865 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
-*----------------------------------------------------------*
-* (c) 1995-2006 Artsoft Entertainment                      *
-*               Holger Schemel                             *
-*               Detmolder Strasse 189                      *
-*               33604 Bielefeld                            *
-*               Germany                                    *
-*               e-mail: info@artsoft.org                   *
-*----------------------------------------------------------*
-* editor.c                                                 *
-***********************************************************/
+// ============================================================================
+// Rocks'n'Diamonds - McDuffin Strikes Back!
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// editor.c
+// ============================================================================
 
 #include <math.h>
 
@@ -4797,7 +4795,7 @@ static int *editor_el_dynamic_ptr = NULL;
 static int num_editor_hl_dynamic = SIZEOF_ARRAY_INT(editor_hl_dynamic);
 static int num_editor_el_dynamic = 0;
 
-static int editor_hl_empty[] = { };
+static int editor_hl_empty[] = { EL_EMPTY };
 #if 1
 static int *editor_el_empty = NULL;    /* dynamically allocated */
 #else
@@ -7743,14 +7741,27 @@ void CheckElementDescriptions()
       Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
 }
 
+static boolean playfield_area_changed = FALSE;
+
 void DrawLevelEd()
 {
+  int old_sx = SX;
+  int old_sy = SY;
+  int old_sxsize = SXSIZE;
+  int old_sysize = SYSIZE;
+
   StopAnimation();
 
   CloseDoor(DOOR_CLOSE_ALL);
 
 #if 1
   FadeOut(REDRAW_FIELD);
+  // FadeOut(REDRAW_ALL);
+#endif
+
+#if 1
+  /* needed after playing if editor playfield area has different size */
+  ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
 #endif
 
 #if 1
@@ -7758,7 +7769,27 @@ void DrawLevelEd()
   ChangeViewportPropertiesIfNeeded();
 #endif
 
+  if (old_sx != SX ||
+      old_sy != SY ||
+      old_sxsize != SXSIZE ||
+      old_sysize != SYSIZE)
+  {
+    playfield_area_changed = TRUE;
+
+#if 0
+    printf("::: %d, %d, %d, %d != %d, %d, %d, %d\n",
+          old_sx, old_sy, old_sxsize, old_sysize,
+          SX, SY, SXSIZE, SYSIZE);
+#endif
+  }
+  else
+    playfield_area_changed = FALSE;
+
+#if 1
+  OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
+#else
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
+#endif
 
 #if DEBUG
   CheckElementDescriptions();
@@ -7831,20 +7862,29 @@ void DrawLevelEd()
   DrawEditModeWindow();
 
 #if 1
+  FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
   FadeIn(REDRAW_FIELD);
+  // FadeIn(REDRAW_ALL);
 #endif
 
   /* copy actual editor door content to door double buffer for OpenDoor() */
+#if 1
+  BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+#else
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+#endif
 
-#if 1
+#if 0
   /* draw new control window (with border) to window */
   redraw_mask |= REDRAW_ALL;
   BackToFront();
 #endif
 
+#if 0
   OpenDoor(DOOR_OPEN_1);
+#endif
 }
 
 static void AdjustDrawingAreaGadgets()
@@ -11894,7 +11934,16 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
       CloseDoor(DOOR_CLOSE_ALL);
 
+#if 0
       BackToFront();           /* force redraw of undrawn special door */
+#endif
+
+#if 1
+      /* needed before playing if editor playfield area has different size */
+      ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+
+      redraw_mask = REDRAW_ALL;
+#endif
 
 #if 0
       DrawCompleteVideoDisplay();
@@ -12376,8 +12425,13 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
       Request("Level has changed! Exit without saving?",
              REQ_ASK | REQ_STAY_OPEN))
   {
+#if 1
+    // CloseDoor(DOOR_CLOSE_1);
+    SetDoorState(DOOR_CLOSE_2);
+#else
     CloseDoor(DOOR_CLOSE_1);
     SetDoorState(DOOR_CLOSE_2);
+#endif
 
 #if 1
     if (quick_quit)
@@ -12388,15 +12442,24 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
 #endif
 
     game_status = GAME_MODE_MAIN;
+#if 1
+    DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
 #if 1
     DrawAndFadeInMainMenu(REDRAW_FIELD);
 #else
     DrawMainMenu();
+#endif
 #endif
   }
   else
   {
+#if 1
+    // CloseDoor(DOOR_CLOSE_1);
+    OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#else
     CloseDoor(DOOR_CLOSE_1);
     OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#endif
   }
 }