changed click events for global animations to ignore 'consumed' clicks
[rocksndiamonds.git] / src / files.c
index f2ff5d21d3b651f05f2f664699ce2e959dc4bd9f..4370cba412ca3492d03ab7644f1111fd2cb12ed9 100644 (file)
@@ -1765,14 +1765,19 @@ static void setLevelInfoToDefaults_Elements(struct LevelInfo *level)
 }
 
 static void setLevelInfoToDefaults(struct LevelInfo *level,
-                                  boolean level_info_only)
+                                  boolean level_info_only,
+                                  boolean reset_file_status)
 {
   setLevelInfoToDefaults_Level(level);
 
   if (!level_info_only)
     setLevelInfoToDefaults_Elements(level);
 
-  level->no_valid_file = FALSE;
+  if (reset_file_status)
+  {
+    level->no_valid_file = FALSE;
+    level->no_level_file = FALSE;
+  }
 
   level->changed = FALSE;
 }
@@ -1786,10 +1791,41 @@ static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info)
   level_file_info->filename = NULL;
 }
 
+int getMappedElement_SB(int, boolean);
+
 static void ActivateLevelTemplate()
 {
   int x, y;
 
+  if (check_special_flags("load_xsb_to_ces"))
+  {
+    /* fill smaller playfields with padding "beyond border wall" elements */
+    if (level.fieldx < level_template.fieldx ||
+       level.fieldy < level_template.fieldy)
+    {
+      short field[level.fieldx][level.fieldy];
+      int new_fieldx = MAX(level.fieldx, level_template.fieldx);
+      int new_fieldy = MAX(level.fieldy, level_template.fieldy);
+      int pos_fieldx = (new_fieldx - level.fieldx) / 2;
+      int pos_fieldy = (new_fieldy - level.fieldy) / 2;
+
+      /* copy old playfield (which is smaller than the visible area) */
+      for (y = 0; y < level.fieldy; y++) for (x = 0; x < level.fieldx; x++)
+       field[x][y] = level.field[x][y];
+
+      /* fill new, larger playfield with "beyond border wall" elements */
+      for (y = 0; y < new_fieldy; y++) for (x = 0; x < new_fieldx; x++)
+       level.field[x][y] = getMappedElement_SB('_', TRUE);
+
+      /* copy the old playfield to the middle of the new playfield */
+      for (y = 0; y < level.fieldy; y++) for (x = 0; x < level.fieldx; x++)
+       level.field[pos_fieldx + x][pos_fieldy + y] = field[x][y];
+
+      level.fieldx = new_fieldx;
+      level.fieldy = new_fieldy;
+    }
+  }
+
   /* Currently there is no special action needed to activate the template
      data, because 'element_info' property settings overwrite the original
      level data, while all other variables do not change. */
@@ -1830,13 +1866,14 @@ static void ActivateLevelTemplate()
 
 static char *getLevelFilenameFromBasename(char *basename)
 {
-  static char *filename = NULL;
+  static char *filename[2] = { NULL, NULL };
+  int pos = (strEqual(basename, LEVELTEMPLATE_FILENAME) ? 0 : 1);
 
-  checked_free(filename);
+  checked_free(filename[pos]);
 
-  filename = getPath2(getCurrentLevelDir(), basename);
+  filename[pos] = getPath2(getCurrentLevelDir(), basename);
 
-  return filename;
+  return filename[pos];
 }
 
 static int getFileTypeFromBasename(char *basename)
@@ -1890,7 +1927,7 @@ static char *getSingleLevelBasenameExt(int nr, char *extension)
   static char basename[MAX_FILENAME_LEN];
 
   if (nr < 0)
-    sprintf(basename, "template.%s", extension);
+    sprintf(basename, "%s", LEVELTEMPLATE_FILENAME);
   else
     sprintf(basename, "%03d.%s", nr, extension);
 
@@ -2022,31 +2059,47 @@ static int getFiletypeFromID(char *filetype_id)
   return filetype;
 }
 
-static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
+char *getLocalLevelTemplateFilename()
 {
-  int nr = lfi->nr;
+  return getDefaultLevelFilename(-1);
+}
 
-  /* special case: level number is negative => check for level template file */
-  if (nr < 0)
+char *getGlobalLevelTemplateFilename()
+{
+  /* global variable "leveldir_current" must be modified in the loop below */
+  LevelDirTree *leveldir_current_last = leveldir_current;
+  char *filename = NULL;
+
+  /* check for template level in path from current to topmost tree node */
+
+  while (leveldir_current != NULL)
   {
-    /* global variable "leveldir_current" must be modified in the loop below */
-    LevelDirTree *leveldir_current_last = leveldir_current;
+    filename = getDefaultLevelFilename(-1);
 
-    /* check for template level in path from current to topmost tree node */
+    if (fileExists(filename))
+      break;
 
-    while (leveldir_current != NULL)
-    {
-      setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND,
-                                          "template.%s", LEVELFILE_EXTENSION);
+    leveldir_current = leveldir_current->node_parent;
+  }
 
-      if (fileExists(lfi->filename))
-       break;
+  /* restore global variable "leveldir_current" modified in above loop */
+  leveldir_current = leveldir_current_last;
 
-      leveldir_current = leveldir_current->node_parent;
-    }
+  return filename;
+}
+
+static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
+{
+  int nr = lfi->nr;
 
-    /* restore global variable "leveldir_current" modified in above loop */
-    leveldir_current = leveldir_current_last;
+  /* special case: level number is negative => check for level template file */
+  if (nr < 0)
+  {
+    setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND,
+                                        getSingleLevelBasename(-1));
+
+    /* replace local level template filename with global template filename */
+    lfi->filename = getGlobalLevelTemplateFilename();
 
     /* no fallback if template file not existing */
     return;
@@ -3133,11 +3186,26 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level,
   if (!(file = openFile(filename, MODE_READ)))
   {
     level->no_valid_file = TRUE;
+    level->no_level_file = TRUE;
 
-    if (!level_info_only)
-      Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
+    if (level_info_only)
+      return;
 
-    return;
+    Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
+
+    if (!setup.editor.use_template_for_new_levels)
+      return;
+
+    /* if level file not found, try to initialize level data from template */
+    filename = getGlobalLevelTemplateFilename();
+
+    if (!(file = openFile(filename, MODE_READ)))
+      return;
+
+    /* default: for empty levels, use level template for custom elements */
+    level->use_custom_template = TRUE;
+
+    level->no_valid_file = FALSE;
   }
 
   getFileChunkBE(file, chunk_name, NULL);
@@ -5756,32 +5824,6 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level,
   {
     /* special global settings can now be set in level template */
 
-    /* fill smaller playfields with padding "beyond border wall" elements */
-    if (level->fieldx < SCR_FIELDX ||
-       level->fieldy < SCR_FIELDY)
-    {
-      short field[level->fieldx][level->fieldy];
-      int new_fieldx = MAX(level->fieldx, SCR_FIELDX);
-      int new_fieldy = MAX(level->fieldy, SCR_FIELDY);
-      int pos_fieldx = (new_fieldx - level->fieldx) / 2;
-      int pos_fieldy = (new_fieldy - level->fieldy) / 2;
-
-      /* copy old playfield (which is smaller than the visible area) */
-      for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++)
-       field[x][y] = level->field[x][y];
-
-      /* fill new, larger playfield with "beyond border wall" elements */
-      for (y = 0; y < new_fieldy; y++) for (x = 0; x < new_fieldx; x++)
-       level->field[x][y] = getMappedElement_SB('_', load_xsb_to_ces);
-
-      /* copy the old playfield to the middle of the new playfield */
-      for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++)
-       level->field[pos_fieldx + x][pos_fieldy + y] = field[x][y];
-
-      level->fieldx = new_fieldx;
-      level->fieldy = new_fieldy;
-    }
-
     level->use_custom_template = TRUE;
   }
 }
@@ -5853,7 +5895,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level,
                                  boolean level_info_only)
 {
   /* always start with reliable default values */
-  setLevelInfoToDefaults(level, level_info_only);
+  setLevelInfoToDefaults(level, level_info_only, TRUE);
 
   switch (level_file_info->type)
   {
@@ -5886,11 +5928,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level,
 
   /* if level file is invalid, restore level structure to default values */
   if (level->no_valid_file)
-  {
-    setLevelInfoToDefaults(level, level_info_only);
-
-    level->no_valid_file = TRUE;       /* but keep "no valid file" flag */
-  }
+    setLevelInfoToDefaults(level, level_info_only, FALSE);
 
   if (level->game_engine_type == GAME_ENGINE_TYPE_UNKNOWN)
     level->game_engine_type = GAME_ENGINE_TYPE_RND;
@@ -7027,7 +7065,8 @@ static int SaveLevel_GRPX(FILE *file, struct LevelInfo *level, int element)
   return chunk_size;
 }
 
-static void SaveLevelFromFilename(struct LevelInfo *level, char *filename)
+static void SaveLevelFromFilename(struct LevelInfo *level, char *filename,
+                                 boolean save_as_template)
 {
   int chunk_size;
   int i;
@@ -7091,7 +7130,7 @@ static void SaveLevelFromFilename(struct LevelInfo *level, char *filename)
   }
 
   /* if not using template level, check for non-default custom/group elements */
-  if (!level->use_custom_template)
+  if (!level->use_custom_template || save_as_template)
   {
     for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
     {
@@ -7127,14 +7166,14 @@ void SaveLevel(int nr)
 {
   char *filename = getDefaultLevelFilename(nr);
 
-  SaveLevelFromFilename(&level, filename);
+  SaveLevelFromFilename(&level, filename, FALSE);
 }
 
 void SaveLevelTemplate()
 {
-  char *filename = getDefaultLevelFilename(-1);
+  char *filename = getLocalLevelTemplateFilename();
 
-  SaveLevelFromFilename(&level, filename);
+  SaveLevelFromFilename(&level, filename, TRUE);
 }
 
 boolean SaveLevelChecked(int nr)
@@ -7158,7 +7197,7 @@ boolean SaveLevelChecked(int nr)
 
 void DumpLevel(struct LevelInfo *level)
 {
-  if (level->no_valid_file)
+  if (level->no_level_file || level->no_valid_file)
   {
     Error(ERR_WARN, "cannot dump -- no valid level file found");
 
@@ -7862,6 +7901,7 @@ void LoadScore(int nr)
 void SaveScore(int nr)
 {
   int i;
+  int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE);
   char *filename = getScoreFilename(nr);
   FILE *file;
 
@@ -7880,7 +7920,7 @@ void SaveScore(int nr)
 
   fclose(file);
 
-  SetFilePermissions(filename, PERMS_PUBLIC);
+  SetFilePermissions(filename, permissions);
 }
 
 
@@ -7908,55 +7948,45 @@ void SaveScore(int nr)
 #define SETUP_TOKEN_TEAM_MODE                  14
 #define SETUP_TOKEN_HANDICAP                   15
 #define SETUP_TOKEN_SKIP_LEVELS                        16
-#define SETUP_TOKEN_TIME_LIMIT                 17
-#define SETUP_TOKEN_FULLSCREEN                 18
-#define SETUP_TOKEN_WINDOW_SCALING_PERCENT     19
-#define SETUP_TOKEN_WINDOW_SCALING_QUALITY     20
-#define SETUP_TOKEN_SCREEN_RENDERING_MODE      21
-#define SETUP_TOKEN_ASK_ON_ESCAPE              22
-#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR       23
-#define SETUP_TOKEN_QUICK_SWITCH               24
-#define SETUP_TOKEN_INPUT_ON_FOCUS             25
-#define SETUP_TOKEN_PREFER_AGA_GRAPHICS                26
-#define SETUP_TOKEN_GAME_FRAME_DELAY           27
-#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS    28
-#define SETUP_TOKEN_SMALL_GAME_GRAPHICS                29
-#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS      30
-#define SETUP_TOKEN_GRAPHICS_SET               31
-#define SETUP_TOKEN_SOUNDS_SET                 32
-#define SETUP_TOKEN_MUSIC_SET                  33
-#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    34
-#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      35
-#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       36
-#define SETUP_TOKEN_VOLUME_SIMPLE              37
-#define SETUP_TOKEN_VOLUME_LOOPS               38
-#define SETUP_TOKEN_VOLUME_MUSIC               39
-#define SETUP_TOKEN_TOUCH_CONTROL_TYPE         40
-#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE                41
-#define SETUP_TOKEN_TOUCH_DROP_DISTANCE                42
-
-#define NUM_GLOBAL_SETUP_TOKENS                        43
+#define SETUP_TOKEN_INCREMENT_LEVELS           17
+#define SETUP_TOKEN_TIME_LIMIT                 18
+#define SETUP_TOKEN_FULLSCREEN                 19
+#define SETUP_TOKEN_WINDOW_SCALING_PERCENT     20
+#define SETUP_TOKEN_WINDOW_SCALING_QUALITY     21
+#define SETUP_TOKEN_SCREEN_RENDERING_MODE      22
+#define SETUP_TOKEN_ASK_ON_ESCAPE              23
+#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR       24
+#define SETUP_TOKEN_QUICK_SWITCH               25
+#define SETUP_TOKEN_INPUT_ON_FOCUS             26
+#define SETUP_TOKEN_PREFER_AGA_GRAPHICS                27
+#define SETUP_TOKEN_GAME_FRAME_DELAY           28
+#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS    29
+#define SETUP_TOKEN_SMALL_GAME_GRAPHICS                30
+#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS      31
+#define SETUP_TOKEN_GRAPHICS_SET               32
+#define SETUP_TOKEN_SOUNDS_SET                 33
+#define SETUP_TOKEN_MUSIC_SET                  34
+#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    35
+#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      36
+#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       37
+#define SETUP_TOKEN_VOLUME_SIMPLE              38
+#define SETUP_TOKEN_VOLUME_LOOPS               39
+#define SETUP_TOKEN_VOLUME_MUSIC               40
+#define SETUP_TOKEN_TOUCH_CONTROL_TYPE         41
+#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE                42
+#define SETUP_TOKEN_TOUCH_DROP_DISTANCE                43
+
+#define NUM_GLOBAL_SETUP_TOKENS                        44
 
 /* editor setup */
-#define SETUP_TOKEN_EDITOR_EL_BOULDERDASH      0
-#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE     1
-#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE_CLUB        2
-#define SETUP_TOKEN_EDITOR_EL_MORE             3
-#define SETUP_TOKEN_EDITOR_EL_SOKOBAN          4
-#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX         5
-#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES    6
-#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH   7
-#define SETUP_TOKEN_EDITOR_EL_CHARS            8
-#define SETUP_TOKEN_EDITOR_EL_STEEL_CHARS      9
-#define SETUP_TOKEN_EDITOR_EL_CUSTOM           10
-#define SETUP_TOKEN_EDITOR_EL_HEADLINES                11
-#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED     12
-#define SETUP_TOKEN_EDITOR_EL_DYNAMIC          13
-#define SETUP_TOKEN_EDITOR_EL_BY_GAME          14
-#define SETUP_TOKEN_EDITOR_EL_BY_TYPE          15
-#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN  16
-
-#define NUM_EDITOR_SETUP_TOKENS                        17
+#define SETUP_TOKEN_EDITOR_EL_CLASSIC          0
+#define SETUP_TOKEN_EDITOR_EL_CUSTOM           1
+#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED     2
+#define SETUP_TOKEN_EDITOR_EL_DYNAMIC          3
+#define SETUP_TOKEN_EDITOR_EL_HEADLINES                4
+#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN  5
+
+#define NUM_EDITOR_SETUP_TOKENS                        6
 
 /* editor cascade setup */
 #define SETUP_TOKEN_EDITOR_CASCADE_BD          0
@@ -8111,6 +8141,7 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_SWITCH, &si.team_mode,               "team_mode"              },
   { TYPE_SWITCH, &si.handicap,                "handicap"               },
   { TYPE_SWITCH, &si.skip_levels,             "skip_levels"            },
+  { TYPE_SWITCH, &si.increment_levels,        "increment_levels"       },
   { TYPE_SWITCH, &si.time_limit,              "time_limit"             },
   { TYPE_SWITCH, &si.fullscreen,              "fullscreen"             },
   { TYPE_INTEGER,&si.window_scaling_percent,  "window_scaling_percent" },
@@ -8141,22 +8172,11 @@ static struct TokenInfo global_setup_tokens[] =
 
 static struct TokenInfo editor_setup_tokens[] =
 {
-  { TYPE_SWITCH, &sei.el_boulderdash,  "editor.el_boulderdash"         },
-  { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine"        },
-  { TYPE_SWITCH, &sei.el_emerald_mine_club,"editor.el_emerald_mine_club"},
-  { TYPE_SWITCH, &sei.el_more,         "editor.el_more"                },
-  { TYPE_SWITCH, &sei.el_sokoban,      "editor.el_sokoban"             },
-  { TYPE_SWITCH, &sei.el_supaplex,     "editor.el_supaplex"            },
-  { TYPE_SWITCH, &sei.el_diamond_caves,        "editor.el_diamond_caves"       },
-  { TYPE_SWITCH, &sei.el_dx_boulderdash,"editor.el_dx_boulderdash"     },
-  { TYPE_SWITCH, &sei.el_chars,                "editor.el_chars"               },
-  { TYPE_SWITCH, &sei.el_steel_chars,  "editor.el_steel_chars"         },
+  { TYPE_SWITCH, &sei.el_classic,      "editor.el_classic"             },
   { TYPE_SWITCH, &sei.el_custom,       "editor.el_custom"              },
-  { TYPE_SWITCH, &sei.el_headlines,    "editor.el_headlines"           },
   { TYPE_SWITCH, &sei.el_user_defined, "editor.el_user_defined"        },
   { TYPE_SWITCH, &sei.el_dynamic,      "editor.el_dynamic"             },
-  { TYPE_SWITCH, &sei.el_by_game,      "editor.el_by_game"             },
-  { TYPE_SWITCH, &sei.el_by_type,      "editor.el_by_type"             },
+  { TYPE_SWITCH, &sei.el_headlines,    "editor.el_headlines"           },
   { TYPE_SWITCH, &sei.show_element_token,"editor.show_element_token"   },
 };
 
@@ -8320,6 +8340,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->team_mode = FALSE;
   si->handicap = TRUE;
   si->skip_levels = TRUE;
+  si->increment_levels = TRUE;
   si->time_limit = TRUE;
   si->fullscreen = FALSE;
   si->window_scaling_percent = STD_WINDOW_SCALING_PERCENT;
@@ -8361,13 +8382,18 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->editor.el_dx_boulderdash         = TRUE;
   si->editor.el_chars                  = TRUE;
   si->editor.el_steel_chars            = TRUE;
+
+  si->editor.el_classic                        = TRUE;
   si->editor.el_custom                 = TRUE;
 
-  si->editor.el_headlines = TRUE;
-  si->editor.el_user_defined = FALSE;
-  si->editor.el_dynamic = TRUE;
+  si->editor.el_user_defined           = FALSE;
+  si->editor.el_dynamic                        = TRUE;
 
-  si->editor.show_element_token = FALSE;
+  si->editor.el_headlines              = TRUE;
+
+  si->editor.show_element_token                = FALSE;
+
+  si->editor.use_template_for_new_levels = TRUE;
 
   si->shortcut.save_game       = DEFAULT_KEY_SAVE_GAME;
   si->shortcut.load_game       = DEFAULT_KEY_LOAD_GAME;
@@ -8966,12 +8992,48 @@ static void InitMenuDesignSettings_SpecialPostProcessing()
 
   /* set default position for snapshot buttons to stop/pause/play buttons */
   for (i = 0; game_buttons_xy[i].dst != NULL; i++)
-  {
     if ((*game_buttons_xy[i].dst).x == -1 &&
        (*game_buttons_xy[i].dst).y == -1)
+      *game_buttons_xy[i].dst = *game_buttons_xy[i].src;
+}
+
+static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics()
+{
+  static struct
+  {
+    struct XYTileSize *dst, *src;
+    int graphic;
+  }
+  editor_buttons_xy[] =
+  {
     {
-      (*game_buttons_xy[i].dst).x = (*game_buttons_xy[i].src).x;
-      (*game_buttons_xy[i].dst).y = (*game_buttons_xy[i].src).y;
+      &editor.button.element_left,     &editor.palette.element_left,
+      IMG_GFX_EDITOR_BUTTON_ELEMENT_LEFT
+    },
+    {
+      &editor.button.element_middle,   &editor.palette.element_middle,
+      IMG_GFX_EDITOR_BUTTON_ELEMENT_MIDDLE
+    },
+    {
+      &editor.button.element_right,    &editor.palette.element_right,
+      IMG_GFX_EDITOR_BUTTON_ELEMENT_RIGHT
+    },
+
+    { NULL,                    NULL                    }
+  };
+  int i;
+
+  /* set default position for element buttons to element graphics */
+  for (i = 0; editor_buttons_xy[i].dst != NULL; i++)
+  {
+    if ((*editor_buttons_xy[i].dst).x == -1 &&
+       (*editor_buttons_xy[i].dst).y == -1)
+    {
+      struct GraphicInfo *gd = &graphic_info[editor_buttons_xy[i].graphic];
+
+      gd->width = gd->height = editor_buttons_xy[i].src->tile_size;
+
+      *editor_buttons_xy[i].dst = *editor_buttons_xy[i].src;
     }
   }
 }
@@ -9359,6 +9421,11 @@ void LoadMenuDesignSettings()
   InitMenuDesignSettings_SpecialPostProcessing();
 }
 
+void LoadMenuDesignSettings_AfterGraphics()
+{
+  InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics();
+}
+
 void LoadUserDefinedEditorElementList(int **elements, int *num_elements)
 {
   char *filename = getEditorSetupFilename();
@@ -10019,7 +10086,7 @@ void ConvertLevels()
     Print("Level %03d: ", level_nr);
 
     LoadLevel(level_nr);
-    if (level.no_valid_file)
+    if (level.no_level_file || level.no_valid_file)
     {
       Print("(no level)\n");
       continue;
@@ -10163,6 +10230,8 @@ void CreateCustomElementImages(char *directory)
 
   SDLInitVideoDisplay();
 
+  ReCreateBitmap(&backbuffer, video.width, video.height);
+
   src_bitmap = LoadImage(src_filename);
 
   bitmap = CreateBitmap(TILEX * 16 * 2,