rnd-20070427-1-src
[rocksndiamonds.git] / src / init.c
index 95d9a1ca54493c4091d152fce4fc11673f87a3e1..9f4b7f9e57cd2a1970679298522811da98eff3ac 100644 (file)
 #include "conf_fnt.c"  /* include auto-generated data structure definitions */
 #include "conf_g2s.c"  /* include auto-generated data structure definitions */
 #include "conf_g2m.c"  /* include auto-generated data structure definitions */
+#include "conf_act.c"  /* include auto-generated data structure definitions */
 
 
 #define CONFIG_TOKEN_FONT_INITIAL              "font.initial"
+#define CONFIG_TOKEN_GLOBAL_BUSY               "global.busy"
+
+#define DEBUG_PRINT_INIT_TIMESTAMPS            TRUE
+#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH      5
 
 
 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
+static struct GraphicInfo    anim_initial;
 
 static int copy_properties[][5] =
 {
@@ -82,6 +88,94 @@ static int copy_properties[][5] =
   }
 };
 
+
+static void print_init_timestamp(char *message)
+{
+#if DEBUG
+#if DEBUG_PRINT_INIT_TIMESTAMPS
+  static char *last_message = NULL;
+  static int counter_nr = 0;
+  int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH;
+
+  if (strEqualPrefix(message, "INIT"))
+  {
+    if (counter_nr + 1 < max_depth)
+    {
+      debug_print_timestamp(counter_nr, NULL);
+      debug_print_timestamp(counter_nr, message);
+    }
+
+    counter_nr++;
+
+    debug_print_timestamp(counter_nr, NULL);
+  }
+  else if (strEqualPrefix(message, "DONE"))
+  {
+    counter_nr--;
+
+    if (counter_nr + 1 < max_depth)
+    {
+      last_message = &message[4];
+
+      debug_print_timestamp(counter_nr, message);
+    }
+  }
+  else if (!strEqualPrefix(message, "TIME") ||
+          !strEqualSuffix(message, last_message))
+  {
+    if (counter_nr < max_depth)
+      debug_print_timestamp(counter_nr, message);
+  }
+#endif
+#endif
+}
+
+void DrawInitAnim()
+{
+  struct GraphicInfo *graphic_info_last = graphic_info;
+  int graphic = 0;
+  static unsigned long action_delay = 0;
+  unsigned long action_delay_value = GameFrameDelay;
+  int sync_frame = FrameCounter;
+  int x, y;
+
+  if (anim_initial.bitmap == NULL || window == NULL)
+    return;
+
+  if (!DelayReached(&action_delay, action_delay_value))
+    return;
+
+#if 0
+  {
+    static unsigned long last_counter = -1;
+    unsigned long current_counter = Counter();
+    unsigned long delay = current_counter - last_counter;
+
+    if (last_counter != -1 && delay > action_delay_value + 5)
+      printf("::: DrawInitAnim: DELAY TOO LONG: %ld\n", delay);
+
+    last_counter = current_counter;
+  }
+#endif
+
+  anim_initial.anim_mode = ANIM_LOOP;
+  anim_initial.anim_start_frame = 0;
+  anim_initial.offset_x = anim_initial.width;
+  anim_initial.offset_y = 0;
+
+  x = WIN_XSIZE / 2 - TILESIZE / 2;
+  y = WIN_YSIZE / 2 - TILESIZE / 2;
+
+  graphic_info = &anim_initial;
+
+  if (sync_frame % anim_initial.anim_delay == 0)
+    DrawGraphicAnimationExt(window, x, y, graphic, sync_frame, NO_MASKING);
+
+  graphic_info = graphic_info_last;
+
+  FrameCounter++;
+}
+
 void FreeGadgets()
 {
   FreeLevelEditorGadgets();
@@ -111,6 +205,12 @@ void InitGadgets()
 
 inline void InitElementSmallImagesScaledUp(int graphic)
 {
+#if 0
+  struct FileInfo *fi = getImageListEntryFromImageID(graphic);
+
+  printf("::: '%s' -> '%s'\n", fi->token, fi->filename);
+#endif
+
   CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor);
 }
 
@@ -167,7 +267,8 @@ static int getFontBitmapID(int font_nr)
 {
   int special = -1;
 
-  if (game_status >= GAME_MODE_TITLE && game_status <= GAME_MODE_PSEUDO_PREVIEW)
+  if (game_status >= GAME_MODE_TITLE_INITIAL &&
+      game_status <= GAME_MODE_PSEUDO_PREVIEW)
     special = game_status;
   else if (game_status == GAME_MODE_PSEUDO_TYPENAME)
     special = GFX_SPECIAL_ARG_MAIN;
@@ -182,6 +283,19 @@ static int getFontBitmapID(int font_nr)
     return font_nr;
 }
 
+static int getFontFromToken(char *token)
+{
+  int i;
+
+  /* !!! OPTIMIZE THIS BY USING HASH !!! */
+  for (i = 0; i < NUM_FONTS; i++)
+    if (strEqual(token, font_info[i].token_name))
+      return i;
+
+  /* if font not found, use reliable default value */
+  return FONT_INITIAL_1;
+}
+
 void InitFontGraphicInfo()
 {
   static struct FontBitmapInfo *font_bitmap_info = NULL;
@@ -192,7 +306,8 @@ void InitFontGraphicInfo()
 
   if (graphic_info == NULL)            /* still at startup phase */
   {
-    InitFontInfo(font_initial, NUM_INITIAL_FONTS, getFontBitmapID);
+    InitFontInfo(font_initial, NUM_INITIAL_FONTS,
+                getFontBitmapID, getFontFromToken);
 
     return;
   }
@@ -411,7 +526,8 @@ void InitFontGraphicInfo()
     }
   }
 
-  InitFontInfo(font_bitmap_info, num_font_bitmaps, getFontBitmapID);
+  InitFontInfo(font_bitmap_info, num_font_bitmaps,
+              getFontBitmapID, getFontFromToken);
 }
 
 void InitElementGraphicInfo()
@@ -439,6 +555,8 @@ void InitElementGraphicInfo()
     }
   }
 
+  UPDATE_BUSY_STATE();
+
   /* initialize normal element/graphic mapping from static configuration */
   for (i = 0; element_to_graphic[i].element > -1; i++)
   {
@@ -497,6 +615,16 @@ void InitElementGraphicInfo()
     int graphic   = property_mapping[i].artwork_index;
     boolean crumbled = FALSE;
 
+#if 0
+    if ((element == EL_EM_DYNAMITE ||
+        element == EL_EM_DYNAMITE_ACTIVE) &&
+       action == ACTION_ACTIVE &&
+       (special == GFX_SPECIAL_ARG_EDITOR ||
+        special == GFX_SPECIAL_ARG_PANEL))
+      printf("::: DYNAMIC: %d, %d, %d -> %d\n",
+            element, action, special, graphic);
+#endif
+
     if (special == GFX_SPECIAL_ARG_CRUMBLED)
     {
       special = -1;
@@ -613,6 +741,8 @@ void InitElementGraphicInfo()
     }
   }
 
+  UPDATE_BUSY_STATE();
+
   /* adjust graphics with 2nd tile for movement according to direction
      (do this before correcting '-1' values to minimize calculations) */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
@@ -672,6 +802,8 @@ void InitElementGraphicInfo()
     }
   }
 
+  UPDATE_BUSY_STATE();
+
   /* now set all '-1' values to element specific default values */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
   {
@@ -823,6 +955,8 @@ void InitElementGraphicInfo()
     }
   }
 
+  UPDATE_BUSY_STATE();
+
 #if 0
   /* !!! THIS ALSO CLEARS SPECIAL FLAGS (AND IS NOT NEEDED ANYWAY) !!! */
   /* set animation mode to "none" for each graphic with only 1 frame */
@@ -890,6 +1024,15 @@ void InitElementSpecialGraphicInfo()
     boolean special_redefined =
       getImageListEntryFromImageID(graphic)->redefined;
 
+#if 0
+    if ((element == EL_EM_DYNAMITE ||
+        element == EL_EM_DYNAMITE_ACTIVE) &&
+       (special == GFX_SPECIAL_ARG_EDITOR ||
+        special == GFX_SPECIAL_ARG_PANEL))
+      printf("::: SPECIAL STATIC: %d, %d -> %d\n",
+            element, special, graphic);
+#endif
+
     /* if the base graphic ("emerald", for example) has been redefined,
        but not the special graphic ("emerald.EDITOR", for example), do not
        use an existing (in this case considered obsolete) special graphic
@@ -903,13 +1046,57 @@ void InitElementSpecialGraphicInfo()
   /* initialize special element/graphic mapping from dynamic configuration */
   for (i = 0; i < num_property_mappings; i++)
   {
-    int element = property_mapping[i].base_index;
-    int special = property_mapping[i].ext3_index;
-    int graphic = property_mapping[i].artwork_index;
+    int element   = property_mapping[i].base_index;
+    int action    = property_mapping[i].ext1_index;
+    int direction = property_mapping[i].ext2_index;
+    int special   = property_mapping[i].ext3_index;
+    int graphic   = property_mapping[i].artwork_index;
+
+#if 0
+    if ((element == EL_EM_DYNAMITE ||
+        element == EL_EM_DYNAMITE_ACTIVE ||
+        element == EL_CONVEYOR_BELT_1_MIDDLE ||
+        element == EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE) &&
+       (special == GFX_SPECIAL_ARG_EDITOR ||
+        special == GFX_SPECIAL_ARG_PANEL))
+      printf("::: SPECIAL DYNAMIC: %d, %d -> %d [%d]\n",
+            element, special, graphic, property_mapping[i].ext1_index);
+#endif
+
+#if 0
+    if (element == EL_CONVEYOR_BELT_1_MIDDLE &&
+       action == ACTION_ACTIVE)
+    {
+      element = EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE;
+      action = -1;
+    }
+#endif
+
+#if 0
+    if (element == EL_MAGIC_WALL &&
+       action == ACTION_ACTIVE)
+    {
+      element = EL_MAGIC_WALL_ACTIVE;
+      action = -1;
+    }
+#endif
+
+#if 1
+    /* for action ".active", replace element with active element, if exists */
+    if (action == ACTION_ACTIVE && element != ELEMENT_ACTIVE(element))
+    {
+      element = ELEMENT_ACTIVE(element);
+      action = -1;
+    }
+#endif
 
     if (element >= MAX_NUM_ELEMENTS)
       continue;
 
+    /* do not change special graphic if action or direction was specified */
+    if (action != -1 || direction != -1)
+      continue;
+
     if (IS_SPECIAL_GFX_ARG(special))
       element_info[element].special_graphic[special] = graphic;
   }
@@ -1016,6 +1203,7 @@ static void set_graphic_parameters(int graphic)
   graphic_info[graphic].anim_delay_random = 0;
   graphic_info[graphic].post_delay_fixed = 0;
   graphic_info[graphic].post_delay_random = 0;
+  graphic_info[graphic].fade_mode = FADE_MODE_DEFAULT;
   graphic_info[graphic].fade_delay = -1;
   graphic_info[graphic].post_delay = -1;
   graphic_info[graphic].auto_delay = -1;
@@ -1207,7 +1395,9 @@ static void set_graphic_parameters(int graphic)
   if (parameter[GFX_ARG_CLONE_FROM] != ARG_UNDEFINED_VALUE)
     graphic_info[graphic].clone_from = parameter[GFX_ARG_CLONE_FROM];
 
-  /* optional settings for drawing title screens */
+  /* optional settings for drawing title screens and title messages */
+  if (parameter[GFX_ARG_FADE_MODE] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].fade_mode = parameter[GFX_ARG_FADE_MODE];
   if (parameter[GFX_ARG_FADE_DELAY] != ARG_UNDEFINED_VALUE)
     graphic_info[graphic].fade_delay = parameter[GFX_ARG_FADE_DELAY];
   if (parameter[GFX_ARG_POST_DELAY] != ARG_UNDEFINED_VALUE)
@@ -1220,6 +1410,8 @@ static void set_graphic_parameters(int graphic)
     graphic_info[graphic].valign = parameter[GFX_ARG_VALIGN];
   if (parameter[GFX_ARG_SORT_PRIORITY] != ARG_UNDEFINED_VALUE)
     graphic_info[graphic].sort_priority = parameter[GFX_ARG_SORT_PRIORITY];
+
+  UPDATE_BUSY_STATE();
 }
 
 static void set_cloned_graphic_parameters(int graphic)
@@ -1287,8 +1479,8 @@ static void InitGraphicInfo()
     IMG_BACKGROUND_ENVELOPE_4,
 
     IMG_BACKGROUND,
+    IMG_BACKGROUND_TITLE_INITIAL,
     IMG_BACKGROUND_TITLE,
-    IMG_BACKGROUND_MESSAGE,
     IMG_BACKGROUND_MAIN,
     IMG_BACKGROUND_LEVELS,
     IMG_BACKGROUND_SCORES,
@@ -1637,7 +1829,7 @@ static void set_sound_parameters(int sound, char **parameter_raw)
   sound_info[sound].volume = parameter[SND_ARG_VOLUME];
 
   /* sound priority to give certain sounds a higher or lower priority */
-  sound_info[sound].volume = parameter[SND_ARG_VOLUME];
+  sound_info[sound].priority = parameter[SND_ARG_PRIORITY];
 }
 
 static void InitSoundInfo()
@@ -1850,21 +2042,36 @@ static void InitMusicInfo()
 
 static void ReinitializeGraphics()
 {
+  print_init_timestamp("INIT ReinitializeGraphics");
+
   InitGraphicInfo();                   /* graphic properties mapping */
+  print_init_timestamp("TIME InitGraphicInfo");
   InitElementGraphicInfo();            /* element game graphic mapping */
+  print_init_timestamp("TIME InitElementGraphicInfo");
   InitElementSpecialGraphicInfo();     /* element special graphic mapping */
+  print_init_timestamp("TIME InitElementSpecialGraphicInfo");
 
   InitElementSmallImages();            /* scale elements to all needed sizes */
+  print_init_timestamp("TIME InitElementSmallImages");
   InitScaledImages();                  /* scale all other images, if needed */
+  print_init_timestamp("TIME InitScaledImages");
   InitFontGraphicInfo();               /* initialize text drawing functions */
+  print_init_timestamp("TIME InitFontGraphicInfo");
 
   InitGraphicInfo_EM();                        /* graphic mapping for EM engine */
+  print_init_timestamp("TIME InitGraphicInfo_EM");
 
   SetMainBackgroundImage(IMG_BACKGROUND);
+  print_init_timestamp("TIME SetMainBackgroundImage");
   SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+  print_init_timestamp("TIME SetDoorBackgroundImage");
 
   InitGadgets();
+  print_init_timestamp("TIME InitGadgets");
   InitToons();
+  print_init_timestamp("TIME InitToons");
+
+  print_init_timestamp("DONE ReinitializeGraphics");
 }
 
 static void ReinitializeSounds()
@@ -4325,19 +4532,64 @@ static void InitGlobal()
 
     element_info[i].token_name = element_name_info[i].token_name;
     element_info[i].class_name = element_name_info[i].class_name;
-    element_info[i].editor_description=element_name_info[i].editor_description;
+    element_info[i].editor_description= element_name_info[i].editor_description;
 
 #if 0
     printf("%04d: %s\n", i, element_name_info[i].token_name);
 #endif
   }
 
+  /* always start with reliable default values (all elements) */
+  for (i = 0; i < MAX_NUM_ELEMENTS; i++)
+    ActiveElement[i] = i;
+
+  /* now add all entries that have an active state (active elements) */
+  for (i = 0; element_with_active_state[i].element != -1; i++)
+  {
+    int element = element_with_active_state[i].element;
+    int element_active = element_with_active_state[i].element_active;
+
+    ActiveElement[element] = element_active;
+  }
+
+  /* always start with reliable default values (all buttons) */
+  for (i = 0; i < NUM_IMAGE_FILES; i++)
+    ActiveButton[i] = i;
+
+  /* now add all entries that have an active state (active buttons) */
+  for (i = 0; button_with_active_state[i].button != -1; i++)
+  {
+    int button = button_with_active_state[i].button;
+    int button_active = button_with_active_state[i].button_active;
+
+    ActiveButton[button] = button_active;
+  }
+
+  /* always start with reliable default values (all fonts) */
+  for (i = 0; i < NUM_FONTS; i++)
+    ActiveFont[i] = i;
+
+  /* now add all entries that have an active state (active fonts) */
+  for (i = 0; font_with_active_state[i].font_nr != -1; i++)
+  {
+    int font = font_with_active_state[i].font_nr;
+    int font_active = font_with_active_state[i].font_nr_active;
+
+    ActiveFont[font] = font_active;
+  }
+
   global.autoplay_leveldir = NULL;
   global.convert_leveldir = NULL;
 
   global.frames_per_second = 0;
   global.fps_slowdown = FALSE;
   global.fps_slowdown_factor = 1;
+
+  global.border_status = GAME_MODE_MAIN;
+#if 0
+  global.fading_status = GAME_MODE_MAIN;
+  global.fading_type = TYPE_ENTER_MENU;
+#endif
 }
 
 void Execute_Command(char *command)
@@ -4742,6 +4994,7 @@ static void InitMixer()
 void InitGfx()
 {
   char *filename_font_initial = NULL;
+  char *filename_anim_initial = NULL;
   Bitmap *bitmap_font_initial = NULL;
   int font_height;
   int i, j;
@@ -4768,7 +5021,7 @@ void InitGfx()
          font_initial[j].src_y = atoi(image_config[i].value);
        else if (strEqual(&image_config[i].token[len_font_token], ".width"))
          font_initial[j].width = atoi(image_config[i].value);
-       else if (strEqual(&image_config[i].token[len_font_token],".height"))
+       else if (strEqual(&image_config[i].token[len_font_token], ".height"))
          font_initial[j].height = atoi(image_config[i].value);
       }
     }
@@ -4815,6 +5068,44 @@ void InitGfx()
   DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
 
   DrawInitText("Loading graphics", 120, FC_GREEN);
+
+#if 1
+  /* determine settings for busy animation (when displaying startup messages) */
+  for (i = 0; image_config[i].token != NULL; i++)
+  {
+    char *anim_token = CONFIG_TOKEN_GLOBAL_BUSY;
+    int len_anim_token = strlen(anim_token);
+
+    if (strEqual(image_config[i].token, anim_token))
+      filename_anim_initial = image_config[i].value;
+    else if (strlen(image_config[i].token) > len_anim_token &&
+            strncmp(image_config[i].token, anim_token, len_anim_token) == 0)
+    {
+      if (strEqual(&image_config[i].token[len_anim_token], ".x"))
+       anim_initial.src_x = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token], ".y"))
+       anim_initial.src_y = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token], ".width"))
+       anim_initial.width = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token], ".height"))
+       anim_initial.height = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token], ".frames"))
+       anim_initial.anim_frames = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token],
+                       ".frames_per_line"))
+       anim_initial.anim_frames_per_line = atoi(image_config[i].value);
+      else if (strEqual(&image_config[i].token[len_anim_token], ".delay"))
+       anim_initial.anim_delay = atoi(image_config[i].value);
+    }
+  }
+
+  if (filename_anim_initial == NULL)   /* should not happen */
+    Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY);
+
+  anim_initial.bitmap = LoadCustomImage(filename_anim_initial);
+
+  InitGfxDrawBusyAnimFunction(DrawInitAnim);
+#endif
 }
 
 void RedrawBackground()
@@ -4832,10 +5123,14 @@ void InitGfxBackground()
   fieldbuffer = bitmap_db_field;
   SetDrawtoField(DRAW_BACKBUFFER);
 
+#if 1
+  ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE);
+#else
   RedrawBackground();
 
   ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
   ClearRectangle(bitmap_db_door, 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE);
+#endif
 
   for (x = 0; x < MAX_BUF_XSIZE; x++)
     for (y = 0; y < MAX_BUF_YSIZE; y++)
@@ -4858,6 +5153,8 @@ void InitLevelArtworkInfo()
 
 static void InitImages()
 {
+  print_init_timestamp("INIT InitImages");
+
   setLevelArtworkDir(artwork.gfx_first);
 
 #if 0
@@ -4869,16 +5166,35 @@ static void InitImages()
         leveldir_current->graphics_path);
 #endif
 
+  UPDATE_BUSY_STATE();
+
   ReloadCustomImages();
+  print_init_timestamp("TIME ReloadCustomImages");
+
+  UPDATE_BUSY_STATE();
 
   LoadCustomElementDescriptions();
-  LoadSpecialMenuDesignSettings();
+  print_init_timestamp("TIME LoadCustomElementDescriptions");
+
+  UPDATE_BUSY_STATE();
+
+  LoadMenuDesignSettings();
+  print_init_timestamp("TIME LoadMenuDesignSettings");
+
+  UPDATE_BUSY_STATE();
 
   ReinitializeGraphics();
+  print_init_timestamp("TIME ReinitializeGraphics");
+
+  UPDATE_BUSY_STATE();
+
+  print_init_timestamp("DONE InitImages");
 }
 
 static void InitSound(char *identifier)
 {
+  print_init_timestamp("INIT InitSound");
+
   if (identifier == NULL)
     identifier = artwork.snd_current->identifier;
 
@@ -4886,11 +5202,18 @@ static void InitSound(char *identifier)
   setLevelArtworkDir(artwork.snd_first);
 
   InitReloadCustomSounds(identifier);
+  print_init_timestamp("TIME InitReloadCustomSounds");
+
   ReinitializeSounds();
+  print_init_timestamp("TIME ReinitializeSounds");
+
+  print_init_timestamp("DONE InitSound");
 }
 
 static void InitMusic(char *identifier)
 {
+  print_init_timestamp("INIT InitMusic");
+
   if (identifier == NULL)
     identifier = artwork.mus_current->identifier;
 
@@ -4898,7 +5221,12 @@ static void InitMusic(char *identifier)
   setLevelArtworkDir(artwork.mus_first);
 
   InitReloadCustomMusic(identifier);
+  print_init_timestamp("TIME InitReloadCustomMusic");
+
   ReinitializeMusic();
+  print_init_timestamp("TIME ReinitializeMusic");
+
+  print_init_timestamp("DONE InitMusic");
 }
 
 void InitNetworkServer()
@@ -5045,7 +5373,7 @@ void ReloadCustomArtwork(int force_reload)
   boolean force_reload_gfx = (force_reload & (1 << ARTWORK_TYPE_GRAPHICS));
   boolean force_reload_snd = (force_reload & (1 << ARTWORK_TYPE_SOUNDS));
   boolean force_reload_mus = (force_reload & (1 << ARTWORK_TYPE_MUSIC));
-  boolean redraw_screen = FALSE;
+  boolean reload_needed;
 
   force_reload_gfx |= AdjustGraphicsForEMC();
 
@@ -5053,6 +5381,18 @@ void ReloadCustomArtwork(int force_reload)
   snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS);
   mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC);
 
+  reload_needed = (gfx_new_identifier != NULL || force_reload_gfx ||
+                  snd_new_identifier != NULL || force_reload_snd ||
+                  mus_new_identifier != NULL || force_reload_mus);
+
+  if (!reload_needed)
+    return;
+
+  print_init_timestamp("INIT ReloadCustomArtwork");
+
+  ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
+  print_init_timestamp("TIME ClearRectangle");
+
   if (gfx_new_identifier != NULL || force_reload_gfx)
   {
 #if 0
@@ -5063,39 +5403,41 @@ void ReloadCustomArtwork(int force_reload)
           leveldir_current->graphics_set);
 #endif
 
-    ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
     InitImages();
-
-    redraw_screen = TRUE;
+    print_init_timestamp("TIME InitImages");
   }
 
   if (snd_new_identifier != NULL || force_reload_snd)
   {
-    ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
     InitSound(snd_new_identifier);
-
-    redraw_screen = TRUE;
+    print_init_timestamp("TIME InitSound");
   }
 
   if (mus_new_identifier != NULL || force_reload_mus)
   {
-    ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
     InitMusic(mus_new_identifier);
-
-    redraw_screen = TRUE;
+    print_init_timestamp("TIME InitMusic");
   }
 
-  if (redraw_screen)
-  {
-    RedrawBackground();
+  RedrawBackground();
 
-    /* force redraw of (open or closed) door graphics */
-    SetDoorState(DOOR_OPEN_ALL);
-    CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
-  }
+  /* force redraw of (open or closed) door graphics */
+  SetDoorState(DOOR_OPEN_ALL);
+  CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
+
+#if 1
+#if 1
+  FadeSetEnterScreen();
+  // FadeSkipNextFadeOut();
+  // FadeSetDisabled();
+#else
+  FadeSkipNext();
+#endif
+#else
+  fading = fading_none;
+#endif
+
+  print_init_timestamp("DONE ReloadCustomArtwork");
 }
 
 void KeyboardAutoRepeatOffUnlessAutoplay()
@@ -5111,6 +5453,8 @@ void KeyboardAutoRepeatOffUnlessAutoplay()
 
 void OpenAll()
 {
+  print_init_timestamp("INIT OpenAll");
+
   InitGlobal();                        /* initialize some global variables */
 
   if (options.execute_command)
@@ -5142,6 +5486,8 @@ void OpenAll()
 
   InitJoysticks();
 
+  print_init_timestamp("TIME [pre-video]");
+
   InitVideoDisplay();
   InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
 
@@ -5150,17 +5496,26 @@ void OpenAll()
   InitElementPropertiesStatic();
   InitElementPropertiesEngine(GAME_VERSION_ACTUAL);
 
+  print_init_timestamp("TIME [post-video]");
+
   InitGfx();
 
-  // debug_print_timestamp(0, "INIT");
+  print_init_timestamp("TIME InitGfx");
+
   InitLevelInfo();
-  // debug_print_timestamp(0, "TIME InitLevelInfo:        ");
+  print_init_timestamp("TIME InitLevelInfo");
+
   InitLevelArtworkInfo();
-  // debug_print_timestamp(0, "TIME InitLevelArtworkInfo: ");
+  print_init_timestamp("TIME InitLevelArtworkInfo");
 
   InitImages();                        /* needs to know current level directory */
+  print_init_timestamp("TIME InitImages");
+
   InitSound(NULL);             /* needs to know current level directory */
+  print_init_timestamp("TIME InitSound");
+
   InitMusic(NULL);             /* needs to know current level directory */
+  print_init_timestamp("TIME InitMusic");
 
   InitGfxBackground();
 
@@ -5181,6 +5536,19 @@ void OpenAll()
 
   game_status = GAME_MODE_MAIN;
 
+#if 1
+  FadeSetEnterScreen();
+  if (!(fading.fade_mode & FADE_TYPE_TRANSFORM))
+    FadeSkipNextFadeOut();
+  // FadeSetDisabled();
+#else
+  fading = fading_none;
+#endif
+
+  print_init_timestamp("TIME [post-artwork]");
+
+  print_init_timestamp("DONE OpenAll");
+
   DrawMainMenu();
 
   InitNetworkServer();