void ReloadCustomArtwork()
{
- static char *leveldir_current_name = NULL;
+ static char *leveldir_current_filename = NULL;
static boolean last_override_level_graphics = FALSE;
static boolean last_override_level_sounds = FALSE;
static boolean last_override_level_music = FALSE;
- if (leveldir_current_name != leveldir_current->name)
+ if (leveldir_current_filename != leveldir_current->filename)
{
- /* force reload of custom artwork after new level series was selected */
- artwork.graphics_set_current_name = NULL;
- artwork.sounds_set_current_name = NULL;
- artwork.music_set_current_name = NULL;
-
- leveldir_current_name = leveldir_current->name;
+ char *filename_old = leveldir_current_filename;
+ char *filename_new = leveldir_current->filename;
+
+ /* force reload of custom artwork after new level series was selected,
+ but reload only that part of the artwork that really has changed */
+ if (getTreeInfoFromFilename(artwork.gfx_first, filename_old) !=
+ getTreeInfoFromFilename(artwork.gfx_first, filename_new))
+ artwork.graphics_set_current_name = NULL;
+ if (getTreeInfoFromFilename(artwork.snd_first, filename_old) !=
+ getTreeInfoFromFilename(artwork.snd_first, filename_new))
+ artwork.sounds_set_current_name = NULL;
+ if (getTreeInfoFromFilename(artwork.mus_first, filename_new) !=
+ getTreeInfoFromFilename(artwork.mus_first, filename_new))
+ artwork.music_set_current_name = NULL;
+
+ leveldir_current_filename = leveldir_current->filename;
}
if (artwork.graphics_set_current_name != artwork.gfx_current->name ||
InitTileClipmasks();
InitGfxBackground();
- SetDoorState(DOOR_OPEN_1 | DOOR_CLOSE_2);
+ /* force redraw of (open or closed) door graphics */
+ SetDoorState(DOOR_OPEN_ALL);
+ CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
artwork.graphics_set_current_name = artwork.gfx_current->name;
last_override_level_graphics = setup.override_level_graphics;
TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node)
{
if (node == NULL)
- {
- if (node->node_top) /* start with first tree entry */
- return getFirstValidTreeInfoEntry(*node->node_top);
- else
- return NULL;
- }
- else if (node->node_group) /* enter level group (step down into tree) */
+ return NULL;
+
+ if (node->node_group) /* enter level group (step down into tree) */
return getFirstValidTreeInfoEntry(node->node_group);
else if (node->parent_link) /* skip start entry of level group */
{
{
if (strcmp(filename, node->filename) == 0)
return node;
+
+ /* special case when looking for level series artwork:
+ node->name_short contains level series filename */
+ if (strcmp(node->filename, ".") == 0 &&
+ strcmp(filename, node->name_short) == 0)
+ return node;
}
node = node->next;
artwork_new->name = getStringCopy(artwork_new->filename);
}
+#if 0
DrawInitText(artwork_new->name, 150, FC_YELLOW);
+#endif
if (artwork_new->name_short == NULL)
artwork_new->name_short = getStringCopy(artwork_new->name);
artwork_new->name_sorting = getStringCopy(artwork_new->name);
}
+ DrawInitText(artwork_new->name, 150, FC_YELLOW);
+
pushTreeInfo(node_first, artwork_new);
freeSetupFileList(setup_file_list);
base_directory);
}
+static TreeInfo *getDummyArtworkInfo(int type)
+{
+ /* this is only needed when there is completely no artwork available */
+ TreeInfo *artwork_new = newTreeInfo();
+
+ setTreeInfoToDefaults(artwork_new, type);
+
+ artwork_new->filename = getStringCopy(NOT_AVAILABLE);
+ artwork_new->fullpath = getStringCopy(NOT_AVAILABLE);
+ artwork_new->basepath = getStringCopy(NOT_AVAILABLE);
+
+ if (artwork_new->name != NULL)
+ free(artwork_new->name);
+
+ artwork_new->name = getStringCopy(NOT_AVAILABLE);
+ artwork_new->name_short = getStringCopy(NOT_AVAILABLE);
+ artwork_new->name_sorting = getStringCopy(NOT_AVAILABLE);
+
+ return artwork_new;
+}
+
void LoadArtworkInfo()
{
DrawInitText("Looking for custom artwork:", 120, FC_GREEN);
getUserMusicDir(),
TREE_TYPE_MUSIC_DIR);
+ if (artwork.gfx_first == NULL)
+ artwork.gfx_first = getDummyArtworkInfo(TREE_TYPE_GRAPHICS_DIR);
+ if (artwork.snd_first == NULL)
+ artwork.snd_first = getDummyArtworkInfo(TREE_TYPE_SOUNDS_DIR);
+ if (artwork.mus_first == NULL)
+ artwork.mus_first = getDummyArtworkInfo(TREE_TYPE_MUSIC_DIR);
+
/* before sorting, the first entries will be from the user directory */
artwork.gfx_current =
getTreeInfoFromFilename(artwork.gfx_first, setup.graphics_set);
artwork.snd_current =
getTreeInfoFromFilename(artwork.snd_first, setup.sounds_set);
if (artwork.snd_current == NULL)
- artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first);
+ artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first);
artwork.mus_current =
getTreeInfoFromFilename(artwork.mus_first, setup.music_set);
if (artwork.mus_current == NULL)
- artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
+ artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
artwork.graphics_set_current_name = artwork.gfx_current->name;
artwork.sounds_set_current_name = artwork.snd_current->name;
/* default name for unknown player names */
#define ANONYMOUS_NAME "anonymous"
+/* default text for non-existant artwork */
+#define NOT_AVAILABLE "(not available)"
+
/* default name for new levels */
#define NAMELESS_LEVEL_NAME "nameless level"
/* needed if last screen was the setup screen and fullscreen state changed */
ToggleFullscreenIfNeeded();
- /* needed if last screen (setup/level) changed graphics, sounds or music */
+ /* needed if last screen (level choice) changed graphics, sounds or music */
ReloadCustomArtwork();
#ifdef TARGET_SDL
static void execSetupGraphics()
{
- setup.graphics_set = artwork.gfx_current->name;
-
setup_mode = SETUP_MODE_GRAPHICS;
DrawSetupScreen();
}
static void execSetupSound()
{
- setup.sounds_set = artwork.snd_current->name;
- setup.music_set = artwork.mus_current->name;
-
setup_mode = SETUP_MODE_SOUND;
DrawSetupScreen();
}
static void execSetupArtwork()
{
+ /* needed if last screen (setup choice) changed graphics, sounds or music */
+ ReloadCustomArtwork();
+
+ setup.graphics_set = artwork.gfx_current->name;
+ setup.sounds_set = artwork.snd_current->name;
+ setup.music_set = artwork.mus_current->name;
+
setup_mode = SETUP_MODE_ARTWORK;
DrawSetupScreen();
}
else if (setup_mode == SETUP_MODE_ARTWORK)
{
setup_info = setup_info_artwork;
- title_string = "Setup Sound";
+ title_string = "Custom Artwork";
}
else if (setup_mode == SETUP_MODE_SHORTCUT)
{
-#define COMPILE_DATE_STRING "[2002-06-10 01:52]"
+#define COMPILE_DATE_STRING "[2002-06-11 01:11]"