From: Holger Schemel Date: Sat, 2 Aug 2003 00:10:09 +0000 (+0200) Subject: rnd-20030802-1-src X-Git-Tag: 3.0.0^2~7 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=2c4f8dc7bc7d04f5e23a6ad9f3e7594bf902ba56 rnd-20030802-1-src --- diff --git a/src/conftime.h b/src/conftime.h index 48476e04..7e8f2f32 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2003-07-31 20:49]" +#define COMPILE_DATE_STRING "[2003-08-02 02:07]" diff --git a/src/init.c b/src/init.c index 376aa8c8..79a67d1e 100644 --- a/src/init.c +++ b/src/init.c @@ -3195,9 +3195,7 @@ void InitLevelArtworkInfo() static void InitImages() { -#if 1 setLevelArtworkDir(artwork.gfx_first); -#endif #if 0 printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n", @@ -3216,19 +3214,27 @@ static void InitImages() ReinitializeGraphics(); } -static void InitSound() +static void InitSound(char *identifier) { + if (identifier == NULL) + identifier = artwork.snd_current->identifier; + + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.snd_first); - InitReloadCustomSounds(artwork.snd_current->identifier); + InitReloadCustomSounds(identifier); ReinitializeSounds(); } -static void InitMusic() +static void InitMusic(char *identifier) { + if (identifier == NULL) + identifier = artwork.mus_current->identifier; + + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.mus_first); - InitReloadCustomMusic(artwork.mus_current->identifier); + InitReloadCustomMusic(identifier); ReinitializeMusic(); } @@ -3255,168 +3261,92 @@ 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; -#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); -#endif + 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; + char *leveldir_artwork_set = LEVELDIR_ARTWORK_SET(leveldir_current, type); + 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; -#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 - 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 + leveldir_current_identifier[type] = leveldir_identifier; + last_has_level_artwork_set[type] = has_level_artwork_set; -#if 0 - printf("::: 2: ['%s'] '%s', '%s'\n", - gfx_new_identifier, identifier_old, identifier_new); -#endif + /* ---------- reload if "override artwork" setting has changed ----------- */ + if (last_override_level_artwork[type] != setup_override_artwork) + artwork_new_identifier = artwork_current_identifier; -#if 0 - leveldir_current_identifier = leveldir_current->identifier; -#endif - } + last_override_level_artwork[type] = setup_override_artwork; - /* 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 current artwork identifier has changed ----------- */ + if (strcmp(ARTWORK_CURRENT_IDENTIFIER(artwork, type), + artwork_current_identifier) != 0) + 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; + *(&(ARTWORK_CURRENT_IDENTIFIER(artwork, type))) = artwork_current_identifier; - if (last_own_level_sounds_set || leveldir_current->sounds_set != NULL) - level_sounds_set_changed = TRUE; - - if (last_own_level_music_set || leveldir_current->music_set != NULL) - level_music_set_changed = TRUE; - - 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); - } - -#if 1 - leveldir_current_identifier = leveldir_current->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, + 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, - level_graphics_set_changed); + 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) + 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 printf("RELOADING GRAPHICS '%s' -> '%s' ['%s']\n", @@ -3425,99 +3355,30 @@ void ReloadCustomArtwork() artwork.gfx_current->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 - -#if 0 - setLevelArtworkDir(artwork.gfx_first); -#endif - ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); InitImages(); -#if 0 - printf("::: %d\n", menu.list_size[GAME_MODE_LEVELS]); -#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; } @@ -3588,8 +3449,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(); diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 449bd0f8..deac8050 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -2217,32 +2217,11 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) { -#if 0 - struct FileInfo *file_list = artwork_info->file_list; - struct ConfigInfo *suffix_list = artwork_info->suffix_list; - char **base_prefixes = artwork_info->base_prefixes; - char **ext1_suffixes = artwork_info->ext1_suffixes; - char **ext2_suffixes = artwork_info->ext2_suffixes; - char **ext3_suffixes = artwork_info->ext3_suffixes; - char **ignore_tokens = artwork_info->ignore_tokens; - int num_file_list_entries = artwork_info->num_file_list_entries; - int num_suffix_list_entries = artwork_info->num_suffix_list_entries; - int num_base_prefixes = artwork_info->num_base_prefixes; - int num_ext1_suffixes = artwork_info->num_ext1_suffixes; - int num_ext2_suffixes = artwork_info->num_ext2_suffixes; - int num_ext3_suffixes = artwork_info->num_ext3_suffixes; - int num_ignore_tokens = artwork_info->num_ignore_tokens; - char *filename = getCustomArtworkConfigFilename(artwork_info->type); - SetupFileHash *setup_file_hash, *extra_file_hash; - char *known_token_value = KNOWN_TOKEN_VALUE; - int i, j, k, l; -#else struct FileInfo *file_list = artwork_info->file_list; int num_file_list_entries = artwork_info->num_file_list_entries; int num_suffix_list_entries = artwork_info->num_suffix_list_entries; char *filename_base, *filename_local; int i, j; -#endif #if 0 printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); @@ -2285,350 +2264,16 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) artwork_info->num_property_mapping_entries = 0; } -#if 1 /* first look for special artwork configured in level series config */ filename_base = getCustomArtworkLevelConfigFilename(artwork_info->type); if (fileExists(filename_base)) LoadArtworkConfigFromFilename(artwork_info, filename_base); -#if 0 - for(i=0; i '%s'\n", - file_list[i].token, file_list[i].filename); -#endif - -#if 1 filename_local = getCustomArtworkConfigFilename(artwork_info->type); if (filename_local != NULL && strcmp(filename_base, filename_local) != 0) LoadArtworkConfigFromFilename(artwork_info, filename_local); - -#if 0 - for(i=0; i '%s'\n", - file_list[i].token, file_list[i].filename); -#endif - -#endif -#endif - -#if 0 - - if (filename == NULL) - return; - - if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) - return; - - /* read parameters for all known config file tokens */ - for (i=0; idynamic_file_list; - int *num_dynamic_file_list_entries = - &artwork_info->num_dynamic_file_list_entries; - struct PropertyMapping **property_mapping = - &artwork_info->property_mapping; - int *num_property_mapping_entries = - &artwork_info->num_property_mapping_entries; - int current_summarized_file_list_entry = - artwork_info->num_file_list_entries + - artwork_info->num_dynamic_file_list_entries; - char *token = HASH_ITERATION_TOKEN(itr); - int len_token = strlen(token); - int start_pos; - boolean base_prefix_found = FALSE; - boolean parameter_suffix_found = FALSE; - - /* skip all parameter definitions (handled by read_token_parameters()) */ - for (i=0; i < num_suffix_list_entries && !parameter_suffix_found; i++) - { - int len_suffix = strlen(suffix_list[i].token); - - if (token_suffix_match(token, suffix_list[i].token, -len_suffix)) - parameter_suffix_found = TRUE; - } - -#if 0 - if (IS_PARENT_PROCESS()) - { - if (parameter_suffix_found) - printf("---> skipping token '%s' (parameter token)\n", token); - else - printf("---> examining token '%s': search prefix ...\n", token); - } -#endif - - if (parameter_suffix_found) - continue; - - /* ---------- step 0: search for matching base prefix ---------- */ - - start_pos = 0; - for (i=0; i examining token '%s': search 1st suffix ...\n", token); -#endif - - /* ---------- step 1: search for matching first suffix ---------- */ - - start_pos += len_base_prefix; - for (j=0; j examining token '%s': search 2nd suffix ...\n", token); -#endif - - /* ---------- step 2: search for matching second suffix ---------- */ - - for (k=0; k examining token '%s': search 3rd suffix ...\n",token); -#endif - - /* ---------- step 3: search for matching third suffix ---------- */ - - for (l=0; lnum_dynamic_file_list_entries > 0) - { - artwork_info->dynamic_artwork_list = - checked_calloc(artwork_info->num_dynamic_file_list_entries * - artwork_info->sizeof_artwork_list_entry); - } - - if (extra_file_hash != NULL && options.verbose && IS_PARENT_PROCESS()) - { - SetupFileList *setup_file_list, *list; - boolean dynamic_tokens_found = FALSE; - boolean unknown_tokens_found = FALSE; - - if ((setup_file_list = loadSetupFileList(filename)) == NULL) - Error(ERR_EXIT, "loadSetupFileHash works, but loadSetupFileList fails"); - - BEGIN_HASH_ITERATION(extra_file_hash, itr) - { - if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) == 0) - dynamic_tokens_found = TRUE; - else - unknown_tokens_found = TRUE; - } - END_HASH_ITERATION(extra_file_hash, itr) - -#if DEBUG - if (dynamic_tokens_found) - { - Error(ERR_RETURN_LINE, "-"); - Error(ERR_RETURN, "dynamic token(s) found:"); - - for (list = setup_file_list; list != NULL; list = list->next) - { - char *value = getHashEntry(extra_file_hash, list->token); - - if (value != NULL && strcmp(value, known_token_value) == 0) - Error(ERR_RETURN, "- dynamic token: '%s'", list->token); - } - - Error(ERR_RETURN_LINE, "-"); - } -#endif - - if (unknown_tokens_found) - { - Error(ERR_RETURN_LINE, "-"); - Error(ERR_RETURN, "warning: unknown token(s) found in config file:"); - Error(ERR_RETURN, "- config file: '%s'", filename); - - for (list = setup_file_list; list != NULL; list = list->next) - { - char *value = getHashEntry(extra_file_hash, list->token); - - if (value != NULL && strcmp(value, known_token_value) != 0) - Error(ERR_RETURN, "- dynamic token: '%s'", list->token); - } - - Error(ERR_RETURN_LINE, "-"); - } - - freeSetupFileList(setup_file_list); - } - - freeSetupFileHash(extra_file_hash); - -#if 0 - for (i=0; i '%s'\n", file_list[i].filename); - else - printf("-> UNDEFINED [-> '%s']\n", file_list[i].default_filename); - } -#endif - -#endif } static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info, @@ -2661,7 +2306,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename) { char *init_text[] = - { "", + { "Loading graphics:", "Loading sounds:", "Loading music:" @@ -2712,6 +2357,10 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, return; } +#if 0 + printf("::: %s: '%s'\n", init_text[artwork_info->type], basename); +#endif + DrawInitText(init_text[artwork_info->type], 120, FC_GREEN); DrawInitText(basename, 150, FC_YELLOW); diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 47f57cb0..51c6f646 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -98,25 +98,25 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] = #define MAX_COOKIE_LEN 256 -#define ARTWORKINFO_FILENAME(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ - GRAPHICSINFO_FILENAME : \ - (type) == TREE_TYPE_SOUNDS_DIR ? \ - SOUNDSINFO_FILENAME : \ - (type) == TREE_TYPE_MUSIC_DIR ? \ +#define ARTWORKINFO_FILENAME(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \ + GRAPHICSINFO_FILENAME : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + SOUNDSINFO_FILENAME : \ + (type) == ARTWORK_TYPE_MUSIC ? \ MUSICINFO_FILENAME : "") -#define ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ - GRAPHICS_DIRECTORY : \ - (type) == TREE_TYPE_SOUNDS_DIR ? \ - SOUNDS_DIRECTORY : \ - (type) == TREE_TYPE_MUSIC_DIR ? \ +#define ARTWORK_DIRECTORY(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \ + GRAPHICS_DIRECTORY : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + SOUNDS_DIRECTORY : \ + (type) == ARTWORK_TYPE_MUSIC ? \ MUSIC_DIRECTORY : "") -#define OPTIONS_ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ - options.graphics_directory : \ - (type) == TREE_TYPE_SOUNDS_DIR ? \ - options.sounds_directory : \ - (type) == TREE_TYPE_MUSIC_DIR ? \ +#define OPTIONS_ARTWORK_DIRECTORY(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \ + options.graphics_directory : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + options.sounds_directory : \ + (type) == ARTWORK_TYPE_MUSIC ? \ options.music_directory : "") @@ -268,6 +268,13 @@ static char *getDefaultMusicDir(char *music_subdir) return music_dir; } +static char *getDefaultArtworkSet(int type) +{ + return (type == TREE_TYPE_GRAPHICS_DIR ? GRAPHICS_SUBDIR : + type == TREE_TYPE_SOUNDS_DIR ? SOUNDS_SUBDIR : + type == TREE_TYPE_MUSIC_DIR ? MUSIC_SUBDIR : ""); +} + static char *getDefaultArtworkDir(int type) { return (type == TREE_TYPE_GRAPHICS_DIR ? @@ -322,26 +329,19 @@ static char *getSetupArtworkDir(TreeInfo *ti) void setLevelArtworkDir(TreeInfo *ti) { - char **artwork_path_ptr, *artwork_set; + char **artwork_path_ptr, **artwork_set_ptr; TreeInfo *level_artwork; if (ti == NULL || leveldir_current == NULL) return; - artwork_path_ptr = - (ti->type == TREE_TYPE_GRAPHICS_DIR ? &leveldir_current->graphics_path : - ti->type == TREE_TYPE_SOUNDS_DIR ? &leveldir_current->sounds_path : - &leveldir_current->music_path); - - artwork_set = - (ti->type == TREE_TYPE_GRAPHICS_DIR ? leveldir_current->graphics_set : - ti->type == TREE_TYPE_SOUNDS_DIR ? leveldir_current->sounds_set : - leveldir_current->music_set); + artwork_path_ptr = &(LEVELDIR_ARTWORK_PATH(leveldir_current, ti->type)); + artwork_set_ptr = &(LEVELDIR_ARTWORK_SET( leveldir_current, ti->type)); if (*artwork_path_ptr != NULL) free(*artwork_path_ptr); - if ((level_artwork = getTreeInfoFromIdentifier(ti, artwork_set))) + if ((level_artwork = getTreeInfoFromIdentifier(ti, *artwork_set_ptr))) *artwork_path_ptr = getStringCopy(getSetupArtworkDir(level_artwork)); else { @@ -354,29 +354,38 @@ void setLevelArtworkDir(TreeInfo *ti) char *dir = getPath2(getCurrentLevelDir(), ARTWORK_DIRECTORY(ti->type)); + if (*artwork_set_ptr != NULL) + free(*artwork_set_ptr); + if (fileExists(dir)) + { *artwork_path_ptr = getStringCopy(getDefaultArtworkDir(ti->type)); + *artwork_set_ptr = getStringCopy(getDefaultArtworkSet(ti->type)); + } else + { *artwork_path_ptr = getStringCopy(UNDEFINED_FILENAME); + *artwork_set_ptr = NULL; + } free(dir); } } -static char *getLevelArtworkDir(int type) +inline static char *getLevelArtworkSet(int type) { - char *artwork_path; + if (leveldir_current == NULL) + return NULL; + return LEVELDIR_ARTWORK_SET(leveldir_current, type); +} + +inline static char *getLevelArtworkDir(int type) +{ if (leveldir_current == NULL) return UNDEFINED_FILENAME; - artwork_path = - (type == TREE_TYPE_GRAPHICS_DIR ? leveldir_current->graphics_path : - type == TREE_TYPE_SOUNDS_DIR ? leveldir_current->sounds_path : - type == TREE_TYPE_MUSIC_DIR ? leveldir_current->music_path : - UNDEFINED_FILENAME); - - return artwork_path; + return LEVELDIR_ARTWORK_PATH(leveldir_current, type); } char *getLevelFilename(int nr) @@ -471,6 +480,7 @@ static char *getCorrectedImageBasename(char *basename) char *getCustomImageFilename(char *basename) { static char *filename = NULL; + boolean skip_setup_artwork = FALSE; if (filename != NULL) free(filename); @@ -479,67 +489,40 @@ char *getCustomImageFilename(char *basename) if (!setup.override_level_graphics) { -#if 0 - /* 1st try: look for special artwork configured in level series config */ - filename = getPath2(getLevelArtworkDir(TREE_TYPE_GRAPHICS_DIR), basename); -#if 0 - if (strcmp(basename, "RocksScreen.pcx") == 0) - printf("::: trying 1 '%s' ...\n", filename); -#endif + /* 1st try: look for special artwork in current level series directory */ + filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename); if (fileExists(filename)) return filename; free(filename); -#endif - /* 2nd try: look for special artwork in current level series directory */ - filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename); -#if 0 - /* - if (strcmp(basename, "RocksScreen.pcx") == 0) - */ - printf("::: trying 2 '%s' ...\n", filename); -#endif - if (fileExists(filename)) - return filename; + /* check if there is special artwork configured in level series config */ + if (getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) != NULL) + { + /* 2nd try: look for special artwork configured in level series config */ + filename = getPath2(getLevelArtworkDir(ARTWORK_TYPE_GRAPHICS), basename); + if (fileExists(filename)) + return filename; - free(filename); + free(filename); -#if 1 - /* 1st try: look for special artwork configured in level series config */ - filename = getPath2(getLevelArtworkDir(TREE_TYPE_GRAPHICS_DIR), basename); -#if 0 - /* - if (strcmp(basename, "RocksScreen.pcx") == 0) - */ - printf("::: trying 2.1 '%s' ...\n", filename); -#endif + /* take missing artwork configured in level set config from default */ + skip_setup_artwork = TRUE; + } + } + + if (!skip_setup_artwork) + { + /* 3rd try: look for special artwork in configured artwork directory */ + filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename); if (fileExists(filename)) return filename; free(filename); -#endif } - /* 3rd try: look for special artwork in configured artwork directory */ - filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename); -#if 0 - /* - if (strcmp(basename, "RocksScreen.pcx") == 0) - */ - printf("::: trying 3 '%s' ...\n", filename); -#endif - if (fileExists(filename)) - return filename; - - free(filename); - /* 4th try: look for default artwork in new default artwork directory */ filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename); -#if 0 - if (strcmp(basename, "RocksScreen.pcx") == 0) - printf("::: trying 4 '%s' ...\n", filename); -#endif if (fileExists(filename)) return filename; @@ -547,10 +530,6 @@ char *getCustomImageFilename(char *basename) /* 5th try: look for default artwork in old default artwork directory */ filename = getPath2(options.graphics_directory, basename); -#if 0 - if (strcmp(basename, "RocksScreen.pcx") == 0) - printf("::: trying 5 '%s' ...\n", filename); -#endif if (fileExists(filename)) return filename; @@ -560,45 +539,45 @@ char *getCustomImageFilename(char *basename) char *getCustomSoundFilename(char *basename) { static char *filename = NULL; + boolean skip_setup_artwork = FALSE; if (filename != NULL) free(filename); if (!setup.override_level_sounds) { -#if 0 - /* 1st try: look for special artwork configured in level series config */ - filename = getPath2(getLevelArtworkDir(TREE_TYPE_SOUNDS_DIR), basename); + /* 1st try: look for special artwork in current level series directory */ + filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename); if (fileExists(filename)) return filename; free(filename); -#endif - /* 2nd try: look for special artwork in current level series directory */ - filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename); - if (fileExists(filename)) - return filename; + /* check if there is special artwork configured in level series config */ + if (getLevelArtworkSet(ARTWORK_TYPE_SOUNDS) != NULL) + { + /* 2nd try: look for special artwork configured in level series config */ + filename = getPath2(getLevelArtworkDir(TREE_TYPE_SOUNDS_DIR), basename); + if (fileExists(filename)) + return filename; - free(filename); + free(filename); + + /* take missing artwork configured in level set config from default */ + skip_setup_artwork = TRUE; + } + } -#if 1 - /* 1st try: look for special artwork configured in level series config */ - filename = getPath2(getLevelArtworkDir(TREE_TYPE_SOUNDS_DIR), basename); + if (!skip_setup_artwork) + { + /* 3rd try: look for special artwork in configured artwork directory */ + filename = getPath2(getSetupArtworkDir(artwork.snd_current), basename); if (fileExists(filename)) return filename; free(filename); -#endif } - /* 3rd try: look for special artwork in configured artwork directory */ - filename = getPath2(getSetupArtworkDir(artwork.snd_current), basename); - if (fileExists(filename)) - return filename; - - free(filename); - /* 4th try: look for default artwork in new default artwork directory */ filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename); if (fileExists(filename)) @@ -644,45 +623,45 @@ char *getCustomArtworkLevelConfigFilename(int type) char *getCustomMusicDirectory(void) { static char *directory = NULL; + boolean skip_setup_artwork = FALSE; if (directory != NULL) free(directory); if (!setup.override_level_music) { -#if 0 - /* 1st try: look for special artwork configured in level series config */ - directory = getStringCopy(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR)); + /* 1st try: look for special artwork in current level series directory */ + directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY); if (fileExists(directory)) return directory; free(directory); -#endif - /* 2nd try: look for special artwork in current level series directory */ - directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY); - if (fileExists(directory)) - return directory; + /* check if there is special artwork configured in level series config */ + if (getLevelArtworkSet(ARTWORK_TYPE_MUSIC) != NULL) + { + /* 2nd try: look for special artwork configured in level series config */ + directory = getStringCopy(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR)); + if (fileExists(directory)) + return directory; - free(directory); + free(directory); -#if 1 - /* 1st try: look for special artwork configured in level series config */ - directory = getStringCopy(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR)); + /* take missing artwork configured in level set config from default */ + skip_setup_artwork = TRUE; + } + } + + if (!skip_setup_artwork) + { + /* 3rd try: look for special artwork in configured artwork directory */ + directory = getStringCopy(getSetupArtworkDir(artwork.mus_current)); if (fileExists(directory)) return directory; free(directory); -#endif } - /* 3rd try: look for special artwork in configured artwork directory */ - directory = getStringCopy(getSetupArtworkDir(artwork.mus_current)); - if (fileExists(directory)) - return directory; - - free(directory); - /* 4th try: look for default artwork in new default artwork directory */ directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR)); if (fileExists(directory)) @@ -1539,7 +1518,8 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent) { Error(ERR_WARN, "setTreeInfoToDefaultsFromParent(): parent == NULL"); - setTreeInfoToDefaults(ldi, TREE_TYPE_GENERIC); + setTreeInfoToDefaults(ldi, TREE_TYPE_UNDEFINED); + return; } diff --git a/src/libgame/system.h b/src/libgame/system.h index a5e0b22e..eaa71dc0 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -216,6 +216,7 @@ #define MUSIC_SUBDIR "mus_orig" #endif + /* areas in bitmap PIX_DOOR */ /* meaning in PIX_DB_DOOR: (3 PAGEs) PAGEX1: 1. buffer for DOOR_1 @@ -235,7 +236,8 @@ #define DOOR_GFX_PAGEY1 (0) #define DOOR_GFX_PAGEY2 (gfx.dysize) -/* functions for version handling */ + +/* macros for version handling */ #define VERSION_IDENT(x,y,z) ((x) * 1000000 + (y) * 10000 + (z) * 100) #define RELEASE_IDENT(x,y,z,r) (VERSION_IDENT(x,y,z) + (r)) #define VERSION_MAJOR(x) ((x) / 1000000) @@ -243,7 +245,8 @@ #define VERSION_PATCH(x) (((x) % 10000) / 100) #define VERSION_RELEASE(x) ((x) % 100) -/* functions for parent/child process identification */ + +/* macros for parent/child process identification */ #if defined(PLATFORM_UNIX) #define IS_PARENT_PROCESS() (audio.mixer_pid != getpid()) #define IS_CHILD_PROCESS() (audio.mixer_pid == getpid()) @@ -254,6 +257,69 @@ #define HAS_CHILD_PROCESS() FALSE #endif + +/* values for artwork type */ +#define ARTWORK_TYPE_GRAPHICS 0 +#define ARTWORK_TYPE_SOUNDS 1 +#define ARTWORK_TYPE_MUSIC 2 + +#define NUM_ARTWORK_TYPES 3 + + +/* values for tree type (chosen to match artwork type) */ +#define TREE_TYPE_UNDEFINED -1 +#define TREE_TYPE_GRAPHICS_DIR ARTWORK_TYPE_GRAPHICS +#define TREE_TYPE_SOUNDS_DIR ARTWORK_TYPE_SOUNDS +#define TREE_TYPE_MUSIC_DIR ARTWORK_TYPE_MUSIC +#define TREE_TYPE_LEVEL_DIR 3 + +#define NUM_TREE_TYPES 4 + + +/* values for artwork handling */ +#define LEVELDIR_ARTWORK_SET(leveldir, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (leveldir)->graphics_set : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (leveldir)->sounds_set : \ + (leveldir)->music_set) + +#define LEVELDIR_ARTWORK_PATH(leveldir, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (leveldir)->graphics_path : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (leveldir)->sounds_path : \ + (leveldir)->music_path) + +#define SETUP_ARTWORK_SET(setup, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (setup).graphics_set : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (setup).sounds_set : \ + (setup).music_set) + +#define SETUP_OVERRIDE_ARTWORK(setup, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (setup).override_level_graphics : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (setup).override_level_sounds : \ + (setup).override_level_music) + +#define ARTWORK_FIRST_NODE(artwork, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (artwork).gfx_first : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (artwork).snd_first : \ + (artwork).mus_first) + +#define ARTWORK_CURRENT_IDENTIFIER(artwork, type) \ + ((type) == ARTWORK_TYPE_GRAPHICS ? \ + (artwork).gfx_current_identifier : \ + (type) == ARTWORK_TYPE_SOUNDS ? \ + (artwork).snd_current_identifier : \ + (artwork).mus_current_identifier) + + /* type definitions */ typedef int (*EventFilter)(const Event *); @@ -469,16 +535,6 @@ struct SetupInfo struct OptionInfo options; }; -#define TREE_TYPE_GENERIC 0 -#define TREE_TYPE_GRAPHICS_DIR 1 -#define TREE_TYPE_SOUNDS_DIR 2 -#define TREE_TYPE_MUSIC_DIR 3 -#define TREE_TYPE_LEVEL_DIR 4 - -#define ARTWORK_TYPE_GRAPHICS TREE_TYPE_GRAPHICS_DIR -#define ARTWORK_TYPE_SOUNDS TREE_TYPE_SOUNDS_DIR -#define ARTWORK_TYPE_MUSIC TREE_TYPE_MUSIC_DIR - struct TreeInfo { struct TreeInfo **node_top; /* topmost node in tree */