rnd-20030924-B-src
[rocksndiamonds.git] / src / init.c
index 229cba0a6512abd9eb5794ade523d49b9689d00e..3c91f4f53752b15706c0b0a49958382eef3ef4ae 100644 (file)
@@ -548,6 +548,36 @@ void InitElementGraphicInfo()
     }
   }
 
+#if 1
+  /* now set all undefined/invalid graphics to -1 to set to default after it */
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+  {
+    for (act=0; act<NUM_ACTIONS; act++)
+    {
+      int graphic;
+
+      graphic = element_info[i].graphic[act];
+      if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
+       element_info[i].graphic[act] = -1;
+
+      graphic = element_info[i].crumbled[act];
+      if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
+       element_info[i].crumbled[act] = -1;
+
+      for (dir=0; dir<NUM_DIRECTIONS; dir++)
+      {
+       graphic = element_info[i].direction_graphic[act][dir];
+       if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
+         element_info[i].direction_graphic[act][dir] = -1;
+
+       graphic = element_info[i].direction_crumbled[act][dir];
+       if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
+         element_info[i].direction_crumbled[act][dir] = -1;
+      }
+    }
+  }
+#endif
+
   /* now set all '-1' values to element specific default values */
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
   {
@@ -576,9 +606,9 @@ void InitElementGraphicInfo()
 
     for (act=0; act<NUM_ACTIONS; act++)
     {
-      boolean act_remove = (act == ACTION_DIGGING ||
-                           act == ACTION_SNAPPING ||
-                           act == ACTION_COLLECTING);
+      boolean act_remove = ((IS_DIGGABLE(i)    && act == ACTION_DIGGING)  ||
+                           (IS_SNAPPABLE(i)   && act == ACTION_SNAPPING) ||
+                           (IS_COLLECTIBLE(i) && act == ACTION_COLLECTING));
 
       /* generic default action graphic (defined by "[default]" directive) */
       int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
@@ -693,6 +723,15 @@ void InitElementSpecialGraphicInfo()
     if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS)
       element_info[element].special_graphic[special] = graphic;
   }
+
+#if 1
+  /* now set all undefined/invalid graphics to default */
+  for (i=0; i < MAX_NUM_ELEMENTS; i++)
+    for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++)
+      if (graphic_info[element_info[i].special_graphic[j]].bitmap == NULL)
+       element_info[i].special_graphic[j] =
+         element_info[i].graphic[ACTION_DEFAULT];
+#endif
 }
 
 static int get_element_from_token(char *token)
@@ -736,6 +775,7 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   graphic_info[graphic].offset_y = 0;  /* ... will be corrected later */
   graphic_info[graphic].crumbled_like = -1;    /* do not use clone element */
   graphic_info[graphic].diggable_like = -1;    /* do not use clone element */
+  graphic_info[graphic].border_size = TILEX / 8;  /* "CRUMBLED" border size */
 
   /* optional x and y tile position of animation frame sequence */
   if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
@@ -825,6 +865,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   if (parameter[GFX_ARG_DIGGABLE_LIKE] != ARG_UNDEFINED_VALUE)
     graphic_info[graphic].diggable_like = parameter[GFX_ARG_DIGGABLE_LIKE];
 
+  /* optional border size for "crumbling" diggable graphics */
+  if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE];
+
   /* this is only used for toon animations */
   graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET];
   graphic_info[graphic].step_delay  = parameter[GFX_ARG_STEP_DELAY];
@@ -832,6 +876,9 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   /* this is only used for drawing font characters */
   graphic_info[graphic].draw_x = parameter[GFX_ARG_DRAW_XOFFSET];
   graphic_info[graphic].draw_y = parameter[GFX_ARG_DRAW_YOFFSET];
+
+  /* this is only used for drawing envelope graphics */
+  graphic_info[graphic].draw_masked = parameter[GFX_ARG_DRAW_MASKED];
 }
 
 static void InitGraphicInfo()
@@ -855,6 +902,10 @@ static void InitGraphicInfo()
 
   graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo));
 
+#if 0
+  printf("::: graphic_info: %d entries\n", num_images);
+#endif
+
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   if (clipmasks_initialized)
   {
@@ -879,7 +930,7 @@ static void InitGraphicInfo()
     int first_frame, last_frame;
 
 #if 0
-    printf("::: image: '%s'\n", image->token);
+    printf("::: image: '%s' [%d]\n", image->token, i);
 #endif
 
 #if 0
@@ -1284,7 +1335,7 @@ void InitElementPropertiesStatic()
     -1
   };
 
-  static int ep_collectible[] =
+  static int ep_collectible_only[] =
   {
     EL_BD_DIAMOND,
     EL_EMERALD,
@@ -1312,7 +1363,10 @@ void InitElementPropertiesStatic()
     EL_SHIELD_NORMAL,
     EL_SHIELD_DEADLY,
     EL_EXTRA_TIME,
-    EL_ENVELOPE,
+    EL_ENVELOPE_1,
+    EL_ENVELOPE_2,
+    EL_ENVELOPE_3,
+    EL_ENVELOPE_4,
     EL_SPEED_PILL,
     -1
   };
@@ -1421,7 +1475,7 @@ void InitElementPropertiesStatic()
     EL_SIGN_EXIT,
     EL_SIGN_YINYANG,
     EL_SIGN_OTHER,
-    EL_STEELWALL_SLANTED,
+    EL_STEELWALL_SLIPPERY,
     EL_EMC_STEELWALL_1,
     EL_EMC_STEELWALL_2,
     EL_EMC_STEELWALL_3,
@@ -1475,7 +1529,7 @@ void InitElementPropertiesStatic()
 
   static int ep_slippery[] =
   {
-    EL_WALL_CRUMBLED,
+    EL_WALL_SLIPPERY,
     EL_BD_WALL,
     EL_ROCK,
     EL_BD_ROCK,
@@ -1504,7 +1558,7 @@ void InitElementPropertiesStatic()
     EL_SP_CHIP_TOP,
     EL_SP_CHIP_BOTTOM,
     EL_SPEED_PILL,
-    EL_STEELWALL_SLANTED,
+    EL_STEELWALL_SLIPPERY,
     EL_PEARL,
     EL_CRYSTAL,
     -1
@@ -1774,6 +1828,7 @@ void InitElementPropertiesStatic()
     EL_PLAYER_2,
     EL_PLAYER_3,
     EL_PLAYER_4,
+    EL_SP_MURPHY,
     -1
   };
 
@@ -1825,7 +1880,7 @@ void InitElementPropertiesStatic()
   {
     EL_EMPTY,
     EL_SAND,
-    EL_WALL_CRUMBLED,
+    EL_WALL_SLIPPERY,
     EL_BD_WALL,
     EL_ROCK,
     EL_BD_ROCK,
@@ -1852,6 +1907,9 @@ void InitElementPropertiesStatic()
 
   static int ep_sp_element[] =
   {
+    /* should always be valid */
+    EL_EMPTY,
+
     EL_SP_EMPTY,
     EL_SP_ZONK,
     EL_SP_BASE,
@@ -2002,7 +2060,7 @@ void InitElementPropertiesStatic()
     EL_EXIT_OPENING,
     EL_EXIT_OPEN,
     EL_WALL,
-    EL_WALL_CRUMBLED,
+    EL_WALL_SLIPPERY,
     EL_EXPANDABLE_WALL,
     EL_EXPANDABLE_WALL_HORIZONTAL,
     EL_EXPANDABLE_WALL_VERTICAL,
@@ -2033,7 +2091,7 @@ void InitElementPropertiesStatic()
     EL_INVISIBLE_STEELWALL_ACTIVE,
     EL_INVISIBLE_WALL,
     EL_INVISIBLE_WALL_ACTIVE,
-    EL_STEELWALL_SLANTED,
+    EL_STEELWALL_SLIPPERY,
     EL_EMC_STEELWALL_1,
     EL_EMC_STEELWALL_2,
     EL_EMC_STEELWALL_3,
@@ -2057,7 +2115,7 @@ void InitElementPropertiesStatic()
     EL_EXPANDABLE_WALL_VERTICAL,
     EL_EXPANDABLE_WALL_ANY,
     EL_BD_WALL,
-    EL_WALL_CRUMBLED,
+    EL_WALL_SLIPPERY,
     EL_EXIT_CLOSED,
     EL_EXIT_OPENING,
     EL_EXIT_OPEN,
@@ -2160,7 +2218,7 @@ void InitElementPropertiesStatic()
     EL_SIGN_EXIT,
     EL_SIGN_YINYANG,
     EL_SIGN_OTHER,
-    EL_STEELWALL_SLANTED,
+    EL_STEELWALL_SLIPPERY,
     EL_EMC_STEELWALL_1,
     EL_EMC_STEELWALL_2,
     EL_EMC_STEELWALL_3,
@@ -2354,7 +2412,7 @@ void InitElementPropertiesStatic()
     EL_SAND,
     EL_WALL,
     EL_BD_WALL,
-    EL_WALL_CRUMBLED,
+    EL_WALL_SLIPPERY,
     EL_STEELWALL,
     EL_AMOEBA_DEAD,
     EL_QUICKSAND_EMPTY,
@@ -2472,7 +2530,7 @@ void InitElementPropertiesStatic()
     EL_SIGN_EXIT,
     EL_SIGN_YINYANG,
     EL_SIGN_OTHER,
-    EL_STEELWALL_SLANTED,
+    EL_STEELWALL_SLIPPERY,
     EL_EMC_STEELWALL_1,
     EL_EMC_STEELWALL_2,
     EL_EMC_STEELWALL_3,
@@ -2495,7 +2553,7 @@ void InitElementPropertiesStatic()
   } element_properties[] =
   {
     { ep_diggable,             EP_DIGGABLE             },
-    { ep_collectible,          EP_COLLECTIBLE          },
+    { ep_collectible_only,     EP_COLLECTIBLE_ONLY     },
     { ep_dont_run_into,                EP_DONT_RUN_INTO        },
     { ep_dont_collide_with,    EP_DONT_COLLIDE_WITH    },
     { ep_dont_touch,           EP_DONT_TOUCH           },
@@ -2639,7 +2697,7 @@ void InitElementPropertiesEngine(int engine_version)
   static int no_wall_properties[] =
   {
     EP_DIGGABLE,
-    EP_COLLECTIBLE,
+    EP_COLLECTIBLE_ONLY,
     EP_DONT_RUN_INTO,
     EP_DONT_COLLIDE_WITH,
     EP_CAN_MOVE,
@@ -2705,6 +2763,10 @@ void InitElementPropertiesEngine(int engine_version)
     SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) ||
                                    IS_PASSABLE(i)));
 
+    /* ---------- COLLECTIBLE ---------------------------------------------- */
+    SET_PROPERTY(i, EP_COLLECTIBLE, (IS_COLLECTIBLE_ONLY(i) ||
+                                    IS_DROPPABLE(i)));
+
     /* ---------- SNAPPABLE ------------------------------------------------ */
     SET_PROPERTY(i, EP_SNAPPABLE, (IS_DIGGABLE(i) ||
                                   IS_COLLECTIBLE(i) ||
@@ -2773,6 +2835,10 @@ void InitElementPropertiesEngine(int engine_version)
                                     CAN_EXPLODE_SMASHED(i) ||
                                     CAN_EXPLODE_IMPACT(i)));
 
+    /* ---------- CAN_EXPLODE_3X3 ------------------------------------------ */
+    SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) &&
+                                        !CAN_EXPLODE_1X1(i)));
+
     /* ---------- CAN_BE_CRUMBLED ------------------------------------------ */
     SET_PROPERTY(i, EP_CAN_BE_CRUMBLED,
                 element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
@@ -2783,6 +2849,12 @@ void InitElementPropertiesEngine(int engine_version)
             element_info[i].token_name,
             element_info[i].crumbled[ACTION_DEFAULT]);
 #endif
+
+    /* ---------- CAN_CHANGE ----------------------------------------------- */
+    SET_PROPERTY(i, EP_CAN_CHANGE, FALSE);     /* default: cannot change */
+    for (j=0; j < element_info[i].num_change_pages; j++)
+      if (element_info[i].change_page[j].can_change)
+       SET_PROPERTY(i, EP_CAN_CHANGE, TRUE);
   }
 
 #if 0
@@ -3200,7 +3272,8 @@ static void InitImages()
 #endif
 
 #if 0
-  printf("::: InitImages ['%s', '%s'] ['%s', '%s']\n",
+  printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n",
+        leveldir_current->identifier,
         artwork.gfx_current_identifier,
         artwork.gfx_current->identifier,
         leveldir_current->graphics_set,
@@ -3215,19 +3288,31 @@ static void InitImages()
   ReinitializeGraphics();
 }
 
-static void InitSound()
+static void InitSound(char *identifier)
 {
+  if (identifier == NULL)
+    identifier = artwork.snd_current->identifier;
+
+#if 1
+  /* set artwork path to send it to the sound server process */
   setLevelArtworkDir(artwork.snd_first);
+#endif
 
-  InitReloadCustomSounds(artwork.snd_current->identifier);
+  InitReloadCustomSounds(identifier);
   ReinitializeSounds();
 }
 
-static void InitMusic()
+static void InitMusic(char *identifier)
 {
+  if (identifier == NULL)
+    identifier = artwork.mus_current->identifier;
+
+#if 1
+  /* set artwork path to send it to the sound server process */
   setLevelArtworkDir(artwork.mus_first);
+#endif
 
-  InitReloadCustomMusic(artwork.mus_current->identifier);
+  InitReloadCustomMusic(identifier);
   ReinitializeMusic();
 }
 
@@ -3254,186 +3339,134 @@ void InitNetworkServer()
 #endif
 }
 
-void ReloadCustomArtwork()
+static char *getNewArtworkIdentifier(int type)
 {
-  static char *leveldir_current_identifier = NULL;
-  static boolean last_override_level_graphics = FALSE;
-  static boolean last_override_level_sounds = FALSE;
-  static boolean last_override_level_music = FALSE;
-  static boolean last_own_level_graphics_set = FALSE;
-  static boolean last_own_level_sounds_set = FALSE;
-  static boolean last_own_level_music_set = FALSE;
-  boolean level_graphics_set_changed = FALSE;
-  boolean level_sounds_set_changed = FALSE;
-  boolean level_music_set_changed = FALSE;
-  /* identifier for new artwork; default: artwork configured in setup */
-#if 0
-  char *gfx_new_identifier = artwork.gfx_current->identifier;
-  char *snd_new_identifier = artwork.snd_current->identifier;
-  char *mus_new_identifier = artwork.mus_current->identifier;
+  static char *leveldir_current_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 };
+  TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type);
+  boolean setup_override_artwork = SETUP_OVERRIDE_ARTWORK(setup, type);
+  char *setup_artwork_set = SETUP_ARTWORK_SET(setup, type);
+  char *leveldir_identifier = leveldir_current->identifier;
+#if 1
+  /* !!! setLevelArtworkDir() should be moved to an earlier stage !!! */
+  char *leveldir_artwork_set = setLevelArtworkDir(artwork_first_node);
 #else
-  char *gfx_new_identifier = artwork.gfx_current_identifier;
-  char *snd_new_identifier = artwork.snd_current_identifier;
-  char *mus_new_identifier = artwork.mus_current_identifier;
-#endif
-  boolean redraw_screen = FALSE;
-
-#if 0
-  if (leveldir_current_identifier == NULL)
-    leveldir_current_identifier = leveldir_current->identifier;
-#endif
-
-#if 0
-  printf("CURRENT GFX: '%s' ['%s']\n", artwork.gfx_current->identifier,
-        leveldir_current->graphics_set);
-  printf("CURRENT LEV: '%s' / '%s'\n", leveldir_current_identifier,
-        leveldir_current->identifier);
-#endif
-
-#if 0
-  printf("graphics --> '%s' ('%s')\n",
-        artwork.gfx_current_identifier, artwork.gfx_current->filename);
-  printf("sounds   --> '%s' ('%s')\n",
-        artwork.snd_current_identifier, artwork.snd_current->filename);
-  printf("music    --> '%s' ('%s')\n",
-        artwork.mus_current_identifier, artwork.mus_current->filename);
+  char *leveldir_artwork_set = LEVELDIR_ARTWORK_SET(leveldir_current, type);
 #endif
+  boolean has_level_artwork_set = (leveldir_artwork_set != NULL);
+  char *artwork_current_identifier;
+  char *artwork_new_identifier = NULL; /* default: nothing has changed */
 
   /* leveldir_current may be invalid (level group, parent link) */
   if (!validLevelSeries(leveldir_current))
-    return;
-
-  /* when a new level series was selected, check if there was a change
-     in custom artwork stored in level series directory */
-  if (1 || leveldir_current_identifier != leveldir_current->identifier)
-  {
-#if 0
-    char *identifier_old = leveldir_current_identifier;
-#endif
-    char *identifier_new = leveldir_current->identifier;
+    return NULL;
+
+  /* 1st step: determine artwork set to be activated in descending order:
+     --------------------------------------------------------------------
+     1. setup artwork (when configured to override everything else)
+     2. artwork set configured in "levelinfo.conf" of current level set
+        (artwork in level directory will have priority when loading later)
+     3. artwork in level directory (stored in artwork sub-directory)
+     4. setup artwork (currently configured in setup menu) */
+
+  if (setup_override_artwork)
+    artwork_current_identifier = setup_artwork_set;
+  else if (leveldir_artwork_set != NULL)
+    artwork_current_identifier = leveldir_artwork_set;
+  else if (getTreeInfoFromIdentifier(artwork_first_node, leveldir_identifier))
+    artwork_current_identifier = leveldir_identifier;
+  else
+    artwork_current_identifier = setup_artwork_set;
 
-#if 0
-    printf("::: 1: ['%s'] '%s', '%s' [%lx, %lx]\n",
-          gfx_new_identifier, identifier_old, identifier_new,
-          getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old),
-          getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new));
-#endif
 
-#if 0
-    if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new) == NULL)
-      gfx_new_identifier = GRAPHICS_SUBDIR;
-    else if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old) !=
-            getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new))
-      gfx_new_identifier = identifier_new;
-#else
-    if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new))
-      gfx_new_identifier = identifier_new;
-    else
-      gfx_new_identifier = setup.graphics_set;
-#endif
+  /* 2nd step: check if it is really needed to reload artwork set
+     ------------------------------------------------------------ */
 
 #if 0
-    if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_new) == NULL)
-      snd_new_identifier = SOUNDS_SUBDIR;
-    else if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_old) !=
-            getTreeInfoFromIdentifier(artwork.snd_first, identifier_new))
-      snd_new_identifier = identifier_new;
-#else
-    if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_new))
-      snd_new_identifier = identifier_new;
-    else
-      snd_new_identifier = setup.sounds_set;
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("::: 0: '%s' ['%s', '%s'] ['%s' ('%s')]\n",
+          artwork_new_identifier,
+          ARTWORK_CURRENT_IDENTIFIER(artwork, type),
+          artwork_current_identifier,
+          leveldir_current->graphics_set,
+          leveldir_current->identifier);
 #endif
 
-#if 0
-    if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) == NULL)
-      mus_new_identifier = MUSIC_SUBDIR;
-    else if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) !=
-            getTreeInfoFromIdentifier(artwork.mus_first, identifier_new))
-      mus_new_identifier = identifier_new;
-#else
-    if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new))
-      mus_new_identifier = identifier_new;
-    else
-      mus_new_identifier = setup.music_set;
-#endif
+  /* ---------- reload if level set and also artwork set has changed ------- */
+  if (leveldir_current_identifier[type] != leveldir_identifier &&
+      (last_has_level_artwork_set[type] || has_level_artwork_set))
+    artwork_new_identifier = artwork_current_identifier;
 
-#if 0
-    printf("::: 2: ['%s'] '%s', '%s'\n",
-          gfx_new_identifier, identifier_old, identifier_new);
-#endif
+  leveldir_current_identifier[type] = leveldir_identifier;
+  last_has_level_artwork_set[type] = has_level_artwork_set;
 
 #if 0
-    leveldir_current_identifier = leveldir_current->identifier;
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("::: 1: '%s'\n", artwork_new_identifier);
 #endif
-  }
 
-  /* custom level artwork configured in level series configuration file
-     always overrides custom level artwork stored in level series directory
-     and (level independent) custom artwork configured in setup menu */
-  if (leveldir_current->graphics_set != NULL)
-    gfx_new_identifier = leveldir_current->graphics_set;
-  if (leveldir_current->sounds_set != NULL)
-    snd_new_identifier = leveldir_current->sounds_set;
-  if (leveldir_current->music_set != NULL)
-    mus_new_identifier = leveldir_current->music_set;
+  /* ---------- reload if "override artwork" setting has changed ----------- */
+  if (last_override_level_artwork[type] != setup_override_artwork)
+    artwork_new_identifier = artwork_current_identifier;
 
-  if (leveldir_current_identifier != leveldir_current->identifier)
-  {
-    if (last_own_level_graphics_set || leveldir_current->graphics_set != NULL)
-      level_graphics_set_changed = TRUE;
+  last_override_level_artwork[type] = setup_override_artwork;
 
-    if (last_own_level_sounds_set || leveldir_current->sounds_set != NULL)
-      level_sounds_set_changed = TRUE;
+#if 0
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("::: 2: '%s'\n", artwork_new_identifier);
+#endif
 
-    if (last_own_level_music_set || leveldir_current->music_set != NULL)
-      level_music_set_changed = TRUE;
+  /* ---------- reload if current artwork identifier has changed ----------- */
+  if (strcmp(ARTWORK_CURRENT_IDENTIFIER(artwork, type),
+            artwork_current_identifier) != 0)
+    artwork_new_identifier = artwork_current_identifier;
 
-    last_own_level_graphics_set = (leveldir_current->graphics_set != NULL);
-    last_own_level_sounds_set = (leveldir_current->sounds_set != NULL);
-    last_own_level_music_set = (leveldir_current->music_set != NULL);
-  }
+  *(&(ARTWORK_CURRENT_IDENTIFIER(artwork, type))) = artwork_current_identifier;
 
-#if 1
-  leveldir_current_identifier = leveldir_current->identifier;
+#if 0
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("::: 3: '%s'\n", artwork_new_identifier);
 #endif
 
-  if (setup.override_level_graphics)
-    gfx_new_identifier = artwork.gfx_current->identifier;
-  if (setup.override_level_sounds)
-    snd_new_identifier = artwork.snd_current->identifier;
-  if (setup.override_level_music)
-    mus_new_identifier = artwork.mus_current->identifier;
+  /* ---------- do not reload directly after starting ---------------------- */
+  if (!initialized[type])
+    artwork_new_identifier = NULL;
 
+  initialized[type] = TRUE;
 
 #if 0
-  printf("CHECKING OLD/NEW GFX:\n  OLD: '%s'\n  NEW: '%s' ['%s', '%s'] [%d]\n",
-        artwork.gfx_current_identifier, gfx_new_identifier,
-        artwork.gfx_current->identifier, leveldir_current->graphics_set,
-        level_graphics_set_changed);
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("::: 4: '%s'\n", artwork_new_identifier);
 #endif
 
-  if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 ||
-      last_override_level_graphics != setup.override_level_graphics ||
-      level_graphics_set_changed)
-  {
 #if 0
-    printf("RELOADING GRAPHICS '%s' -> '%s' ['%s']\n",
-          artwork.gfx_current_identifier,
-          gfx_new_identifier,
-          artwork.gfx_current->identifier);
+  if (type == ARTWORK_TYPE_GRAPHICS)
+    printf("CHECKING OLD/NEW GFX:\n- OLD: %s\n- NEW: %s ['%s', '%s'] ['%s']\n",
+          artwork.gfx_current_identifier, artwork_current_identifier,
+          artwork.gfx_current->identifier, leveldir_current->graphics_set,
+          artwork_new_identifier);
 #endif
 
-#if 0
-    artwork.gfx_current =
-      getTreeInfoFromIdentifier(artwork.gfx_first, gfx_new_identifier);
-#endif
-#if 0
-    artwork.gfx_current_identifier = gfx_new_identifier;
-#endif
+  return artwork_new_identifier;
+}
 
+void ReloadCustomArtwork()
+{
+  char *gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS);
+  char *snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS);
+  char *mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC);
+  boolean redraw_screen = FALSE;
+
+  if (gfx_new_identifier != NULL)
+  {
 #if 0
-    setLevelArtworkDir(artwork.gfx_first);
+    printf("RELOADING GRAPHICS '%s' -> '%s' ['%s', '%s']\n",
+          artwork.gfx_current_identifier,
+          gfx_new_identifier,
+          artwork.gfx_current->identifier,
+          leveldir_current->graphics_set);
 #endif
 
     ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
@@ -3441,82 +3474,30 @@ void ReloadCustomArtwork()
     InitImages();
 
 #if 0
-    printf("::: %d\n", menu.list_size[GAME_MODE_LEVELS]);
+    printf("... '%s'\n",
+          leveldir_current->graphics_set);
 #endif
 
     FreeTileClipmasks();
     InitTileClipmasks();
-#if 0
-    artwork.gfx_current =
-      getTreeInfoFromIdentifier(artwork.gfx_first, gfx_new_identifier);
-#endif
-#if 0
-    printf("::: '%s', %lx\n", gfx_new_identifier, artwork.gfx_current);
-#endif
-
-#if 0
-    artwork.gfx_current_identifier = artwork.gfx_current->identifier;
-#endif
-    artwork.gfx_current_identifier = gfx_new_identifier;
-    last_override_level_graphics = setup.override_level_graphics;
-
-#if 0
-    printf("DONE RELOADING GFX: '%s' ['%s']\n",
-          artwork.gfx_current_identifier, artwork.gfx_current->identifier);
-#endif
 
     redraw_screen = TRUE;
   }
 
-  if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 ||
-      last_override_level_sounds != setup.override_level_sounds ||
-      level_sounds_set_changed)
+  if (snd_new_identifier != NULL)
   {
-#if 0
-    printf("RELOADING SOUNDS '%s' -> '%s' ('%s')\n",
-          artwork.snd_current_identifier,
-          artwork.snd_current->identifier,
-          snd_new_identifier);
-#endif
-
-    /* set artwork path to send it to the sound server process */
-    setLevelArtworkDir(artwork.snd_first);
-
     ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
-    InitReloadCustomSounds(snd_new_identifier);
-    ReinitializeSounds();
-
-#if 0
-    artwork.snd_current =
-      getTreeInfoFromIdentifier(artwork.snd_first, setup.sounds_set);
-    artwork.snd_current_identifier = artwork.snd_current->identifier;
-#endif
-    artwork.snd_current_identifier = snd_new_identifier;
-    last_override_level_sounds = setup.override_level_sounds;
+    InitSound(snd_new_identifier);
 
     redraw_screen = TRUE;
   }
 
-  if (strcmp(artwork.mus_current_identifier, mus_new_identifier) != 0 ||
-      last_override_level_music != setup.override_level_music ||
-      level_music_set_changed)
+  if (mus_new_identifier != NULL)
   {
-    /* set artwork path to send it to the sound server process */
-    setLevelArtworkDir(artwork.mus_first);
-
     ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
-    InitReloadCustomMusic(mus_new_identifier);
-    ReinitializeMusic();
-
-#if 0
-    artwork.mus_current =
-      getTreeInfoFromIdentifier(artwork.mus_first, setup.music_set);
-    artwork.mus_current_identifier = artwork.mus_current->identifier;
-#endif
-    artwork.mus_current_identifier = mus_new_identifier;
-    last_override_level_music = setup.override_level_music;
+    InitMusic(mus_new_identifier);
 
     redraw_screen = TRUE;
   }
@@ -3580,6 +3561,7 @@ void OpenAll()
   InitEventFilter(FilterMouseMotionEvents);
 
   InitElementPropertiesStatic();
+  InitElementPropertiesEngine(GAME_VERSION_ACTUAL);
 
   InitGfx();
 
@@ -3587,8 +3569,8 @@ void OpenAll()
   InitLevelArtworkInfo();
 
   InitImages();                        /* needs to know current level directory */
-  InitSound();                 /* needs to know current level directory */
-  InitMusic();                 /* needs to know current level directory */
+  InitSound(NULL);             /* needs to know current level directory */
+  InitMusic(NULL);             /* needs to know current level directory */
 
   InitGfxBackground();