changed using improved pseudo-random number generator for UUID generation
[rocksndiamonds.git] / src / init.c
index bbf62e674f8dd9cb60416716ea11d4cf4628dd62..114b177fb1578c19f30248069d85bf6a23acb350 100644 (file)
@@ -333,6 +333,8 @@ static int getFontBitmapID(int font_nr)
     special = game_status;
   else if (game_status == GAME_MODE_PSEUDO_TYPENAME)
     special = GFX_SPECIAL_ARG_MAIN;
+  else if (game_status == GAME_MODE_PSEUDO_TYPENAMES)
+    special = GFX_SPECIAL_ARG_NAMES;
 
   if (special != -1)
     return font_info[font_nr].special_bitmap_id[special];
@@ -650,15 +652,14 @@ static void InitGlobalAnimGraphicInfo(void)
   }
 
 #if 0
-  printf("::: InitGlobalAnimGraphicInfo\n");
-
   for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
     for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
       for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
        if (global_anim_info[i].graphic[j][k] != IMG_UNDEFINED &&
            graphic_info[global_anim_info[i].graphic[j][k]].bitmap != NULL)
-         printf("::: - anim %d, part %d, mode %d => %d\n",
-                i, j, k, global_anim_info[i].graphic[j][k]);
+         Debug("init:InitGlobalAnimGraphicInfo",
+               "anim %d, part %d, mode %d => %d",
+               i, j, k, global_anim_info[i].graphic[j][k]);
 #endif
 }
 
@@ -700,14 +701,13 @@ static void InitGlobalAnimSoundInfo(void)
   }
 
 #if 0
-  printf("::: InitGlobalAnimSoundInfo\n");
-
   for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
     for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
       for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
        if (global_anim_info[i].sound[j][k] != SND_UNDEFINED)
-         printf("::: - anim %d, part %d, mode %d => %d\n",
-                i, j, k, global_anim_info[i].sound[j][k]);
+         Debug("init:InitGlobalAnimSoundInfo",
+               "anim %d, part %d, mode %d => %d",
+               i, j, k, global_anim_info[i].sound[j][k]);
 #endif
 }
 
@@ -749,14 +749,13 @@ static void InitGlobalAnimMusicInfo(void)
   }
 
 #if 0
-  printf("::: InitGlobalAnimMusicInfo\n");
-
   for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
     for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
       for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
        if (global_anim_info[i].music[j][k] != MUS_UNDEFINED)
-         printf("::: - anim %d, part %d, mode %d => %d\n",
-                i, j, k, global_anim_info[i].music[j][k]);
+         Debug("init:InitGlobalAnimMusicInfo",
+               "anim %d, part %d, mode %d => %d",
+               i, j, k, global_anim_info[i].music[j][k]);
 #endif
 }
 
@@ -1658,7 +1657,7 @@ static void set_cloned_graphic_parameters(int graphic)
     Warn("custom graphic rejected for this element/action");
 
     if (graphic == fallback_graphic)
-      Error(ERR_EXIT, "no fallback graphic available");
+      Fail("no fallback graphic available");
 
     Warn("fallback done to 'char_exclam' for this graphic");
     Warn("---");
@@ -1698,6 +1697,7 @@ static void InitGraphicInfo(void)
     IMG_BACKGROUND_TITLE_INITIAL,
     IMG_BACKGROUND_TITLE,
     IMG_BACKGROUND_MAIN,
+    IMG_BACKGROUND_NAMES,
     IMG_BACKGROUND_LEVELS,
     IMG_BACKGROUND_LEVELNR,
     IMG_BACKGROUND_SCORES,
@@ -1811,7 +1811,7 @@ static void InitGraphicInfo(void)
       Warn("custom graphic rejected for this element/action");
 
       if (i == fallback_graphic)
-       Error(ERR_EXIT, "no fallback graphic available");
+       Fail("no fallback graphic available");
 
       Warn("fallback done to 'char_exclam' for this graphic");
       Warn("---");
@@ -1842,7 +1842,7 @@ static void InitGraphicInfo(void)
       Warn("custom graphic rejected for this element/action");
 
       if (i == fallback_graphic)
-       Error(ERR_EXIT, "no fallback graphic available");
+       Fail("no fallback graphic available");
 
       Warn("fallback done to 'char_exclam' for this graphic");
       Warn("---");
@@ -1882,7 +1882,10 @@ static void InitGraphicCompatibilityInfo(void)
        // process all images which default to same image as "global.door"
        if (strEqual(fi->default_filename, fi_global_door->default_filename))
        {
-         // printf("::: special treatment needed for token '%s'\n", fi->token);
+#if 0
+         Debug("init:InitGraphicCompatibilityInfo",
+               "special treatment needed for token '%s'", fi->token);
+#endif
 
          graphic_info[i].bitmaps = graphic_info[IMG_GLOBAL_DOOR].bitmaps;
          graphic_info[i].bitmap  = graphic_info[IMG_GLOBAL_DOOR].bitmap;
@@ -4661,7 +4664,7 @@ void InitElementPropertiesEngine(int engine_version)
                                                  i == EL_BLACK_ORB));
 
     // ---------- COULD_MOVE_INTO_ACID ----------------------------------------
-    SET_PROPERTY(i, EP_COULD_MOVE_INTO_ACID, (ELEM_IS_PLAYER(i) ||
+    SET_PROPERTY(i, EP_COULD_MOVE_INTO_ACID, (IS_PLAYER_ELEMENT(i) ||
                                              CAN_MOVE(i) ||
                                              IS_CUSTOM_ELEMENT(i)));
 
@@ -4782,7 +4785,7 @@ static void InitGlobal(void)
   {
     // check if element_name_info entry defined for each element in "main.h"
     if (i < MAX_NUM_ELEMENTS && element_name_info[i].token_name == NULL)
-      Error(ERR_EXIT, "undefined 'element_name_info' entry for element %d", i);
+      Fail("undefined 'element_name_info' entry for element %d", i);
 
     element_info[i].token_name = element_name_info[i].token_name;
     element_info[i].class_name = element_name_info[i].class_name;
@@ -4794,7 +4797,7 @@ static void InitGlobal(void)
     // check if global_anim_name_info defined for each entry in "main.h"
     if (i < NUM_GLOBAL_ANIM_TOKENS &&
        global_anim_name_info[i].token_name == NULL)
-      Error(ERR_EXIT, "undefined 'global_anim_name_info' entry for anim %d", i);
+      Fail("undefined 'global_anim_name_info' entry for anim %d", i);
 
     global_anim_info[i].token_name = global_anim_name_info[i].token_name;
   }
@@ -4900,7 +4903,10 @@ static void InitGlobal(void)
   global.autoplay_leveldir = NULL;
   global.patchtapes_leveldir = NULL;
   global.convert_leveldir = NULL;
-  global.create_images_dir = NULL;
+  global.dumplevel_leveldir = NULL;
+  global.dumptape_leveldir = NULL;
+  global.create_sketch_images_dir = NULL;
+  global.create_collect_images_dir = NULL;
 
   global.frames_per_second = 0;
   global.show_frames_per_second = FALSE;
@@ -4909,6 +4915,8 @@ static void InitGlobal(void)
   global.anim_status = global.anim_status_next = GAME_MODE_LOADING;
 
   global.use_envelope_request = FALSE;
+
+  global.user_names = NULL;
 }
 
 static void Execute_Command(char *command)
@@ -5010,39 +5018,70 @@ static void Execute_Command(char *command)
   {
     char *filename = &command[11];
 
-    if (!fileExists(filename))
-      Error(ERR_EXIT, "cannot open file '%s'", filename);
+    if (fileExists(filename))
+    {
+      LoadLevelFromFilename(&level, filename);
+      DumpLevel(&level);
 
-    LoadLevelFromFilename(&level, filename);
-    DumpLevel(&level);
+      exit(0);
+    }
 
-    exit(0);
+    char *leveldir = getStringCopy(filename);  // read command parameters
+    char *level_nr = strchr(leveldir, ' ');
+
+    if (level_nr == NULL)
+      Fail("cannot open file '%s'", filename);
+
+    *level_nr++ = '\0';
+
+    global.dumplevel_leveldir = leveldir;
+    global.dumplevel_level_nr = atoi(level_nr);
+
+    program.headless = TRUE;
   }
   else if (strPrefix(command, "dump tape "))
   {
     char *filename = &command[10];
 
-    if (!fileExists(filename))
-      Error(ERR_EXIT, "cannot open file '%s'", filename);
+    if (fileExists(filename))
+    {
+      LoadTapeFromFilename(filename);
+      DumpTape(&tape);
 
-    LoadTapeFromFilename(filename);
-    DumpTape(&tape);
+      exit(0);
+    }
 
-    exit(0);
+    char *leveldir = getStringCopy(filename);  // read command parameters
+    char *level_nr = strchr(leveldir, ' ');
+
+    if (level_nr == NULL)
+      Fail("cannot open file '%s'", filename);
+
+    *level_nr++ = '\0';
+
+    global.dumptape_leveldir = leveldir;
+    global.dumptape_level_nr = atoi(level_nr);
+
+    program.headless = TRUE;
   }
   else if (strPrefix(command, "autoplay ") ||
           strPrefix(command, "autoffwd ") ||
           strPrefix(command, "autowarp ") ||
           strPrefix(command, "autotest ") ||
+          strPrefix(command, "autosave ") ||
+          strPrefix(command, "autoupload ") ||
           strPrefix(command, "autofix "))
   {
-    char *str_ptr = getStringCopy(&command[8]);        // read command parameters
+    char *arg_ptr = strchr(command, ' ');
+    char *str_ptr = getStringCopy(arg_ptr);    // read command parameters
 
     global.autoplay_mode =
       (strPrefix(command, "autoplay") ? AUTOPLAY_MODE_PLAY :
        strPrefix(command, "autoffwd") ? AUTOPLAY_MODE_FFWD :
        strPrefix(command, "autowarp") ? AUTOPLAY_MODE_WARP :
        strPrefix(command, "autotest") ? AUTOPLAY_MODE_TEST :
+       strPrefix(command, "autosave") ? AUTOPLAY_MODE_SAVE :
+       strPrefix(command, "autoupload") ? AUTOPLAY_MODE_UPLOAD :
        strPrefix(command, "autofix")  ? AUTOPLAY_MODE_FIX :
        AUTOPLAY_MODE_NONE);
 
@@ -5090,7 +5129,7 @@ static void Execute_Command(char *command)
       str_ptr++;
 
     if (*str_ptr == '\0')
-      Error(ERR_EXIT, "cannot find MODE in command '%s'", command);
+      Fail("cannot find MODE in command '%s'", command);
 
     global.patchtapes_mode = str_ptr;          // store patch mode
 
@@ -5135,7 +5174,7 @@ static void Execute_Command(char *command)
       if (strEqual(global.patchtapes_mode, "help"))
        global.patchtapes_leveldir = UNDEFINED_LEVELSET;
       else
-       Error(ERR_EXIT, "cannot find LEVELDIR in command '%s'", command);
+       Fail("cannot find LEVELDIR in command '%s'", command);
     }
 
     program.headless = TRUE;
@@ -5156,13 +5195,21 @@ static void Execute_Command(char *command)
 
     program.headless = TRUE;
   }
-  else if (strPrefix(command, "create images "))
+  else if (strPrefix(command, "create sketch images "))
   {
-    global.create_images_dir = getStringCopy(&command[14]);
+    global.create_sketch_images_dir = getStringCopy(&command[21]);
 
-    if (access(global.create_images_dir, W_OK) != 0)
-      Error(ERR_EXIT, "image target directory '%s' not found or not writable",
-           global.create_images_dir);
+    if (access(global.create_sketch_images_dir, W_OK) != 0)
+      Fail("image target directory '%s' not found or not writable",
+          global.create_sketch_images_dir);
+  }
+  else if (strPrefix(command, "create collect image "))
+  {
+    global.create_collect_images_dir = getStringCopy(&command[21]);
+
+    if (access(global.create_collect_images_dir, W_OK) != 0)
+      Fail("image target directory '%s' not found or not writable",
+          global.create_collect_images_dir);
   }
   else if (strPrefix(command, "create CE image "))
   {
@@ -5172,7 +5219,7 @@ static void Execute_Command(char *command)
   }
   else
   {
-    Error(ERR_EXIT_HELP, "unrecognized command '%s'", command);
+    FailWithHelp("unrecognized command '%s'", command);
   }
 
   // disable networking if any valid command was recognized
@@ -5181,8 +5228,10 @@ static void Execute_Command(char *command)
 
 static void InitSetup(void)
 {
+  LoadUserNames();                             // global user names
+  LoadUserSetup();                             // global user number
+
   LoadSetup();                                 // global setup info
-  LoadSetup_AutoSetup();                       // global auto setup info
 
   // set some options from setup file
 
@@ -5197,7 +5246,9 @@ static void InitGameInfo(void)
 {
   game.restart_level = FALSE;
   game.restart_game_message = NULL;
+
   game.request_active = FALSE;
+  game.request_active_or_moving = FALSE;
 }
 
 static void InitPlayerInfo(void)
@@ -5463,7 +5514,7 @@ static void InitGfx(void)
   }
 
   if (filename_font_initial == NULL)   // should not happen
-    Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
+    Fail("cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
 
   InitGfxBuffers();
   InitGfxCustomArtworkInfo();
@@ -5478,7 +5529,7 @@ static void InitGfx(void)
 
   DrawProgramInfo();
 
-  DrawInitText("Loading graphics", 120, FC_GREEN);
+  DrawInitTextHead("Loading graphics");
 
   // initialize settings for busy animation with default values
   int parameter[NUM_GFX_ARGS];
@@ -5549,7 +5600,7 @@ static void InitGfx(void)
   }
 
   if (filename_anim_initial == NULL)   // should not happen
-    Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY);
+    Fail("cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY);
 
   anim_initial.bitmaps =
     checked_calloc(sizeof(Bitmap *) * NUM_IMG_BITMAP_POINTERS);
@@ -5621,36 +5672,36 @@ static void InitImages(void)
   print_timestamp_init("InitImages");
 
 #if 0
-  printf("::: leveldir_current->identifier == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
-  printf("::: leveldir_current->graphics_path == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
-  printf("::: leveldir_current->graphics_set == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set);
-  printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS));
+  Debug("init:InitImages", "leveldir_current->identifier == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
+  Debug("init:InitImages", "leveldir_current->graphics_path == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
+  Debug("init:InitImages", "leveldir_current->graphics_set == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set);
+  Debug("init:InitImages", "getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'",
+       leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS));
 #endif
 
   setLevelArtworkDir(artwork.gfx_first);
 
 #if 0
-  printf("::: leveldir_current->identifier == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
-  printf("::: leveldir_current->graphics_path == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
-  printf("::: leveldir_current->graphics_set == '%s'\n",
+  Debug("init:InitImages", "leveldir_current->identifier == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
+  Debug("init:InitImages", "leveldir_current->graphics_path == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
+  Debug("init:InitImages", "leveldir_current->graphics_set == '%s'",
         leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set);
-  printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS));
+  Debug("init:InitImages", "getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'",
+       leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS));
 #endif
 
 #if 0
-  printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n",
-        leveldir_current->identifier,
-        artwork.gfx_current_identifier,
-        artwork.gfx_current->identifier,
-        leveldir_current->graphics_set,
-        leveldir_current->graphics_path);
+  Debug("init:InitImages", "InitImages for '%s' ['%s', '%s'] ['%s', '%s']",
+       leveldir_current->identifier,
+       artwork.gfx_current_identifier,
+       artwork.gfx_current->identifier,
+       leveldir_current->graphics_set,
+       leveldir_current->graphics_path);
 #endif
 
   UPDATE_BUSY_STATE();
@@ -5809,22 +5860,27 @@ static boolean CheckArtworkTypeForRedefinedCustomElements(int type)
   setLevelArtworkDir(ARTWORK_FIRST_NODE(artwork, type));
 
 #if 0
-  printf("::: leveldir_current->identifier == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
-  printf("::: leveldir_current->graphics_path == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
-  printf("::: leveldir_current->graphics_set == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set);
-  printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n",
-        leveldir_current == NULL ? "[NULL]" :
-        LEVELDIR_ARTWORK_SET(leveldir_current, type));
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "leveldir_current->identifier == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "leveldir_current->graphics_path == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "leveldir_current->graphics_set == '%s'",
+       leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'",
+       leveldir_current == NULL ? "[NULL]" :
+       LEVELDIR_ARTWORK_SET(leveldir_current, type));
 #endif
 
   // first look for special artwork configured in level series config
   filename_base = getCustomArtworkLevelConfigFilename(type);
 
 #if 0
-  printf("::: filename_base == '%s'\n", filename_base);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "filename_base == '%s'", filename_base);
 #endif
 
   if (fileExists(filename_base))
@@ -5833,14 +5889,16 @@ static boolean CheckArtworkTypeForRedefinedCustomElements(int type)
   filename_local = getCustomArtworkConfigFilename(type);
 
 #if 0
-  printf("::: filename_local == '%s'\n", filename_local);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "filename_local == '%s'", filename_local);
 #endif
 
   if (filename_local != NULL && !strEqual(filename_base, filename_local))
     redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local);
 
 #if 0
-  printf("::: redefined_ce_found == %d\n", redefined_ce_found);
+  Debug("init:CheckArtworkTypeForRedefinedCustomElements",
+       "redefined_ce_found == %d", redefined_ce_found);
 #endif
 
   return redefined_ce_found;
@@ -5865,7 +5923,8 @@ static void InitOverrideArtwork(void)
        CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_MUSIC));
 
 #if 0
-  printf("::: redefined_ce_found == %d\n", redefined_ce_found);
+  Debug("init:InitOverrideArtwork", "redefined_ce_found == %d",
+       redefined_ce_found);
 #endif
 
   if (redefined_ce_found)
@@ -5884,16 +5943,17 @@ static void InitOverrideArtwork(void)
   }
 
 #if 0
-  printf("::: => %d, %d, %d\n",
-        gfx.override_level_graphics,
-        gfx.override_level_sounds,
-        gfx.override_level_music);
+  Debug("init:InitOverrideArtwork", "%d, %d, %d",
+       gfx.override_level_graphics,
+       gfx.override_level_sounds,
+       gfx.override_level_music);
 #endif
 }
 
 static char *getNewArtworkIdentifier(int type)
 {
-  static char *leveldir_current_identifier[3] = { NULL, NULL, NULL };
+  static char *last_leveldir_identifier[3] = { NULL, NULL, NULL };
+  static char *last_artwork_identifier[3] = { NULL, NULL, NULL };
   static boolean last_override_level_artwork[3] = { FALSE, FALSE, FALSE };
   static boolean last_has_level_artwork_set[3] = { FALSE, FALSE, FALSE };
   static boolean initialized[3] = { FALSE, FALSE, FALSE };
@@ -5928,16 +5988,15 @@ static char *getNewArtworkIdentifier(int type)
   else
     artwork_current_identifier = setup_artwork_set;
 
-
   /* 2nd step: check if it is really needed to reload artwork set
      ------------------------------------------------------------ */
 
   // ---------- reload if level set and also artwork set has changed ----------
-  if (leveldir_current_identifier[type] != leveldir_identifier &&
+  if (last_leveldir_identifier[type] != leveldir_identifier &&
       (last_has_level_artwork_set[type] || has_level_artwork_set))
     artwork_new_identifier = artwork_current_identifier;
 
-  leveldir_current_identifier[type] = leveldir_identifier;
+  last_leveldir_identifier[type] = leveldir_identifier;
   last_has_level_artwork_set[type] = has_level_artwork_set;
 
   // ---------- reload if "override artwork" setting has changed --------------
@@ -5947,11 +6006,13 @@ static char *getNewArtworkIdentifier(int type)
   last_override_level_artwork[type] = setup_override_artwork;
 
   // ---------- reload if current artwork identifier has changed --------------
-  if (!strEqual(ARTWORK_CURRENT_IDENTIFIER(artwork, type),
-               artwork_current_identifier))
+  if (!strEqual(last_artwork_identifier[type], artwork_current_identifier))
     artwork_new_identifier = artwork_current_identifier;
 
-  *(ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type))= artwork_current_identifier;
+  // (we cannot compare string pointers here, so copy string content itself)
+  setString(&last_artwork_identifier[type], artwork_current_identifier);
+
+  *(ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type)) = artwork_current_identifier;
 
   // ---------- do not reload directly after starting -------------------------
   if (!initialized[type])
@@ -5975,8 +6036,8 @@ void ReloadCustomArtwork(int force_reload)
 
   InitOverrideArtwork();
 
-  force_reload_gfx |= AdjustGraphicsForEMC();
-  force_reload_snd |= AdjustSoundsForEMC();
+  AdjustGraphicsForEMC();
+  AdjustSoundsForEMC();
 
   gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS);
   snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS);
@@ -6003,11 +6064,12 @@ void ReloadCustomArtwork(int force_reload)
   if (gfx_new_identifier != NULL || force_reload_gfx)
   {
 #if 0
-    printf("RELOADING GRAPHICS '%s' -> '%s' ['%s', '%s']\n",
-          artwork.gfx_current_identifier,
-          gfx_new_identifier,
-          artwork.gfx_current->identifier,
-          leveldir_current->graphics_set);
+    Debug("init:ReloadCustomArtwork",
+         "RELOADING GRAPHICS '%s' -> '%s' ['%s', '%s']",
+         artwork.gfx_current_identifier,
+         gfx_new_identifier,
+         artwork.gfx_current->identifier,
+         leveldir_current->graphics_set);
 #endif
 
     InitImages();
@@ -6133,14 +6195,16 @@ void OpenAll(void)
 
   InitGlobal();                        // initialize some global variables
 
+  InitRND(NEW_RANDOMIZE);
+  InitSimpleRandom(NEW_RANDOMIZE);
+  InitBetterRandom(NEW_RANDOMIZE);
+
   print_timestamp_time("[init global stuff]");
 
   InitSetup();
 
   print_timestamp_time("[init setup/config stuff (1)]");
 
-  InitScoresInfo();
-
   if (options.execute_command)
     Execute_Command(options.execute_command);
 
@@ -6170,9 +6234,6 @@ void OpenAll(void)
   InitMixer();
   print_timestamp_time("[init setup/config stuff (6)]");
 
-  InitRND(NEW_RANDOMIZE);
-  InitSimpleRandom(NEW_RANDOMIZE);
-
   InitJoysticks();
 
   print_timestamp_time("[init setup/config stuff]");
@@ -6237,11 +6298,26 @@ void OpenAll(void)
     ConvertLevels();
     return;
   }
-  else if (global.create_images_dir)
+  else if (global.dumplevel_leveldir)
+  {
+    DumpLevels();
+    return;
+  }
+  else if (global.dumptape_leveldir)
+  {
+    DumpTapes();
+    return;
+  }
+  else if (global.create_sketch_images_dir)
   {
     CreateLevelSketchImages();
     return;
   }
+  else if (global.create_collect_images_dir)
+  {
+    CreateCollectElementImages();
+    return;
+  }
 
   InitNetworkServer();
 
@@ -6255,6 +6331,9 @@ void OpenAll(void)
 
   print_timestamp_done("OpenAll");
 
+  if (setup.ask_for_remaining_tapes)
+    setup.ask_for_uploading_tapes = TRUE;
+
   DrawMainMenu();
 
 #if 0
@@ -6276,8 +6355,44 @@ void OpenAll(void)
 #endif
 }
 
+static boolean WaitForApiThreads(void)
+{
+  unsigned int thread_delay = 0;
+  unsigned int thread_delay_value = 10000;
+
+  if (program.api_thread_count == 0)
+    return TRUE;
+
+  // deactivate global animations (not accessible in game state "loading")
+  setup.toons = FALSE;
+
+  // set game state to "loading" to be able to show busy animation
+  SetGameStatus(GAME_MODE_LOADING);
+
+  ResetDelayCounter(&thread_delay);
+
+  // wait for threads to finish (and fail on timeout)
+  while (program.api_thread_count > 0)
+  {
+    if (DelayReached(&thread_delay, thread_delay_value))
+    {
+      Error("failed waiting for threads - TIMEOUT");
+
+      return FALSE;
+    }
+
+    UPDATE_BUSY_STATE();
+
+    Delay(20);
+  }
+
+  return TRUE;
+}
+
 void CloseAllAndExit(int exit_value)
 {
+  WaitForApiThreads();
+
   StopSounds();
   FreeAllSounds();
   FreeAllMusic();
@@ -6293,8 +6408,8 @@ void CloseAllAndExit(int exit_value)
   // using SDL_WaitThread()
   //
   // Code used with SDL 1.2:
-  // if (network_server)       // terminate network server
-  //   SDL_KillThread(server_thread);
+  // if (network.server_thread)        // terminate network server
+  //   SDL_KillThread(network.server_thread);
 
   CloseVideoDisplay();
   ClosePlatformDependentStuff();