fixed fading complete screen if playfield viewport has changed
[rocksndiamonds.git] / src / editor.c
index ce772508756c57a322a451fec2dc922d1601fc4a..5f9b2b9d9e0f95807b7e5b9142c67bd6104e2842 100644 (file)
@@ -1297,7 +1297,6 @@ 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 int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 
 static struct
@@ -5689,6 +5688,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));
 
@@ -7591,7 +7594,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
 
@@ -8230,19 +8233,38 @@ 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_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 }
 
+static void ChangeEditorToLevelSet(char *levelset_subdir)
+{
+  leveldir_current = getTreeInfoFromIdentifier(leveldir_first, levelset_subdir);
+
+  // the previous level set might have used custom artwork
+  ReloadCustomArtwork(0);
+
+  LoadLevelSetup_SeriesInfo();
+
+  SaveLevelSetup_LastSeries();
+  SaveLevelSetup_SeriesInfo();
+
+  TapeErase();
+
+  LoadLevel(level_nr);
+  LoadScore(level_nr);
+
+  DrawLevelEd();
+}
+
 void DrawLevelEd()
 {
   int fade_mask = REDRAW_FIELD;
 
   FadeSoundsAndMusic();
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
@@ -8255,7 +8277,7 @@ void DrawLevelEd()
   InitZoomLevelSettings(-1);
   InitLevelSetInfo();
 
-  OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
+  SetDoorState(DOOR_OPEN_1 | DOOR_OPEN_2);
 
 #if DEBUG
   CheckElementDescriptions();
@@ -8766,10 +8788,18 @@ static void DrawLevelInfoLevel()
     MapTextInputGadget(i);
 }
 
+static char *getLevelSubdirFromSaveMode(int save_mode)
+{
+  if (save_mode == LEVELSET_SAVE_MODE_CREATE)
+    return getNewUserLevelSubdir();
+
+  return leveldir_current->subdir;
+}
+
 static void DrawLevelInfoLevelSet_DirectoryInfo()
 {
   char *directory_text = "Level set directory:";
-  char *directory_name = leveldir_current->subdir;
+  char *directory_name = getLevelSubdirFromSaveMode(levelset_save_mode);
   int font1_nr = FONT_TEXT_1;
   int font2_nr = FONT_TEXT_2;
   int font1_height = getFontHeight(font1_nr);
@@ -8777,9 +8807,6 @@ static void DrawLevelInfoLevelSet_DirectoryInfo()
   int x = ED_LEVEL_SETTINGS_X(0);
   int y = ED_LEVEL_SETTINGS_Y(6);
 
-  if (levelset_save_mode == LEVELSET_SAVE_MODE_CREATE)
-    directory_name = getNewUserLevelSubdir();
-
   PrintInfoText(directory_text, font1_nr, x, y - yoffset_above);
   PrintInfoText(directory_name, font2_nr, x, y);
 }
@@ -12586,6 +12613,8 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
   }
   else if (type_id == ED_TEXTBUTTON_ID_SAVE_LEVELSET)
   {
+    char *levelset_subdir = getLevelSubdirFromSaveMode(levelset_save_mode);
+
     if (levelset_save_mode == LEVELSET_SAVE_MODE_UPDATE &&
        leveldir_current->readonly)
     {
@@ -12610,11 +12639,10 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
 
     if (levelset_save_mode == LEVELSET_SAVE_MODE_UPDATE)
     {
-      if (UpdateUserLevelSet(leveldir_current->subdir,
+      if (UpdateUserLevelSet(levelset_subdir,
                             levelset_name,
                             levelset_author,
-                            levelset_num_levels,
-                            levelset_first_level_nr))
+                            levelset_num_levels))
       {
        Request("Level set updated!", REQ_CONFIRM);
       }
@@ -12625,20 +12653,20 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
     }
     else
     {
-      if (CreateUserLevelSet(getNewUserLevelSubdir(),
+      if (CreateUserLevelSet(levelset_subdir,
                             levelset_name,
                             levelset_author,
-                            levelset_num_levels,
-                            levelset_first_level_nr))
+                            levelset_num_levels))
       {
        Request("New level set created!", REQ_CONFIRM);
+
+       AddUserLevelSetToLevelInfo(levelset_subdir);
+       ChangeEditorToLevelSet(levelset_subdir);
       }
       else
       {
        Request("Creating new level set failed!", REQ_CONFIRM);
       }
-
-      DrawLevelInfoWindow();   // update (increment) level set directory name
     }
   }
   else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE &&