X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=929ce3348b305dee810dcb66aab779fb13c73b7f;hb=8f33ee4940b9c35bf4627b7ef1126d03748da646;hp=086531614eaa54fb229bc3558ce92fe7ca7befa0;hpb=5fe60f460c869b600fe5c223aa7374b55450a949;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 08653161..929ce334 100644 --- a/src/files.c +++ b/src/files.c @@ -1032,7 +1032,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) int element = EL_CUSTOM_START + i; /* order of checking and copying events to be mapped is important */ - for (j = CE_BY_OTHER_ACTION; j >= CE_BY_PLAYER; j--) + for (j = CE_BY_OTHER_ACTION; j >= CE_BY_PLAYER_OBSOLETE; j--) { if (HAS_CHANGE_EVENT(element, j - 2)) { @@ -1042,7 +1042,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) } /* order of checking and copying events to be mapped is important */ - for (j = CE_OTHER_GETS_COLLECTED; j >= CE_COLLISION; j--) + for (j = CE_OTHER_GETS_COLLECTED; j >= CE_COLLISION_ACTIVE; j--) { if (HAS_CHANGE_EVENT(element, j - 1)) { @@ -1058,11 +1058,11 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) { int element = EL_CUSTOM_START + i; - if (HAS_CHANGE_EVENT(element, CE_BY_PLAYER) || - HAS_CHANGE_EVENT(element, CE_BY_COLLISION)) + if (HAS_CHANGE_EVENT(element, CE_BY_PLAYER_OBSOLETE) || + HAS_CHANGE_EVENT(element, CE_BY_COLLISION_OBSOLETE)) { - SET_CHANGE_EVENT(element, CE_BY_PLAYER, FALSE); - SET_CHANGE_EVENT(element, CE_BY_COLLISION, FALSE); + SET_CHANGE_EVENT(element, CE_BY_PLAYER_OBSOLETE, FALSE); + SET_CHANGE_EVENT(element, CE_BY_COLLISION_OBSOLETE, FALSE); SET_CHANGE_EVENT(element, CE_BY_DIRECT_ACTION, TRUE); } @@ -2011,6 +2011,13 @@ void LoadTape(int level_nr) LoadTapeFromFilename(filename); } +void LoadSolutionTape(int level_nr) +{ + char *filename = getSolutionTapeFilename(level_nr); + + LoadTapeFromFilename(filename); +} + static void SaveTape_VERS(FILE *file, struct TapeInfo *tape) { putFileVersion(file, tape->file_version); @@ -2762,23 +2769,6 @@ void LoadSpecialMenuDesignSettings() freeSetupFileHash(setup_file_hash); } -static char *itoa(unsigned int i) -{ - static char *a = NULL; - - if (a != NULL) - free(a); - - if (i > 2147483647) /* yes, this is a kludge */ - i = 2147483647; - - a = checked_malloc(10 + 1); - - sprintf(a, "%d", i); - - return a; -} - void LoadUserDefinedEditorElementList(int **elements, int *num_elements) { char *filename = getEditorSetupFilename(); @@ -2793,7 +2783,7 @@ void LoadUserDefinedEditorElementList(int **elements, int *num_elements) element_hash = newSetupFileHash(); for (i = 0; i < NUM_FILE_ELEMENTS; i++) - setHashEntry(element_hash, element_info[i].token_name, itoa(i)); + setHashEntry(element_hash, element_info[i].token_name, i_to_a(i)); /* determined size may be larger than needed (due to unknown elements) */ *num_elements = 0; @@ -2846,12 +2836,12 @@ void LoadUserDefinedEditorElementList(int **elements, int *num_elements) #endif } -static struct MusicFileInfo *get_music_file_info(char *basename, int music) +static struct MusicFileInfo *get_music_file_info_ext(char *basename, int music, + boolean is_sound) { SetupFileHash *setup_file_hash = NULL; struct MusicFileInfo tmp_music_file_info, *new_music_file_info; - char *filename_music = getCustomMusicFilename(basename); - char *filename_prefix, *filename_info; + char *filename_music, *filename_prefix, *filename_info; struct { char *token; @@ -2859,15 +2849,23 @@ static struct MusicFileInfo *get_music_file_info(char *basename, int music) } token_to_value_ptr[] = { - { "context", &tmp_music_file_info.context }, - { "title", &tmp_music_file_info.title }, - { "artist", &tmp_music_file_info.artist }, - { "album", &tmp_music_file_info.album }, - { "year", &tmp_music_file_info.year }, - { NULL, NULL }, + { "title_header", &tmp_music_file_info.title_header }, + { "artist_header", &tmp_music_file_info.artist_header }, + { "album_header", &tmp_music_file_info.album_header }, + { "year_header", &tmp_music_file_info.year_header }, + + { "title", &tmp_music_file_info.title }, + { "artist", &tmp_music_file_info.artist }, + { "album", &tmp_music_file_info.album }, + { "year", &tmp_music_file_info.year }, + + { NULL, NULL }, }; int i; + filename_music = (is_sound ? getCustomSoundFilename(basename) : + getCustomMusicFilename(basename)); + if (filename_music == NULL) return NULL; @@ -2918,10 +2916,12 @@ static struct MusicFileInfo *get_music_file_info(char *basename, int music) char *value = getHashEntry(setup_file_hash, token_to_value_ptr[i].token); *token_to_value_ptr[i].value_ptr = - getStringCopy(value != NULL ? value : UNKNOWN_NAME); + getStringCopy(value != NULL && *value != '\0' ? value : UNKNOWN_NAME); } + tmp_music_file_info.basename = getStringCopy(basename); tmp_music_file_info.music = music; + tmp_music_file_info.is_sound = is_sound; new_music_file_info = checked_malloc(sizeof(struct MusicFileInfo)); *new_music_file_info = tmp_music_file_info; @@ -2929,14 +2929,45 @@ static struct MusicFileInfo *get_music_file_info(char *basename, int music) return new_music_file_info; } +static struct MusicFileInfo *get_music_file_info(char *basename, int music) +{ + return get_music_file_info_ext(basename, music, FALSE); +} + +static struct MusicFileInfo *get_sound_file_info(char *basename, int sound) +{ + return get_music_file_info_ext(basename, sound, TRUE); +} + +static boolean music_info_listed_ext(struct MusicFileInfo *list, + char *basename, boolean is_sound) +{ + for (; list != NULL; list = list->next) + if (list->is_sound == is_sound && strcmp(list->basename, basename) == 0) + return TRUE; + + return FALSE; +} + +static boolean music_info_listed(struct MusicFileInfo *list, char *basename) +{ + return music_info_listed_ext(list, basename, FALSE); +} + +static boolean sound_info_listed(struct MusicFileInfo *list, char *basename) +{ + return music_info_listed_ext(list, basename, TRUE); +} + void LoadMusicInfo() { char *music_directory = getCustomMusicDirectory(); int num_music = getMusicListSize(); int num_music_noconf = 0; + int num_sounds = getSoundListSize(); DIR *dir; struct dirent *dir_entry; - struct FileInfo *music; + struct FileInfo *music, *sound; struct MusicFileInfo *next, **new; int i; @@ -2944,16 +2975,17 @@ void LoadMusicInfo() { next = music_file_info->next; - if (music_file_info->context) - free(music_file_info->context); - if (music_file_info->title) - free(music_file_info->title); - if (music_file_info->artist) - free(music_file_info->artist); - if (music_file_info->album) - free(music_file_info->album); - if (music_file_info->year) - free(music_file_info->year); + checked_free(music_file_info->basename); + + checked_free(music_file_info->title_header); + checked_free(music_file_info->artist_header); + checked_free(music_file_info->album_header); + checked_free(music_file_info->year_header); + + checked_free(music_file_info->title); + checked_free(music_file_info->artist); + checked_free(music_file_info->album); + checked_free(music_file_info->year); free(music_file_info); @@ -2962,10 +2994,21 @@ void LoadMusicInfo() new = &music_file_info; +#if 0 + printf("::: num_music == %d\n", num_music); +#endif + for (i = 0; i < num_music; i++) { music = getMusicListEntry(i); +#if 0 + printf("::: %d [%08x]\n", i, music->filename); +#endif + + if (music->filename == NULL) + continue; + if (strcmp(music->filename, UNDEFINED_FILENAME) == 0) continue; @@ -2977,9 +3020,12 @@ void LoadMusicInfo() printf("::: -> '%s' (configured)\n", music->filename); #endif - *new = get_music_file_info(music->filename, i); - if (*new != NULL) - new = &(*new)->next; + if (!music_info_listed(music_file_info, music->filename)) + { + *new = get_music_file_info(music->filename, i); + if (*new != NULL) + new = &(*new)->next; + } } if ((dir = opendir(music_directory)) == NULL) @@ -2998,6 +3044,9 @@ void LoadMusicInfo() { music = getMusicListEntry(i); + if (music->filename == NULL) + continue; + if (strcmp(basename, music->filename) == 0) { music_already_used = TRUE; @@ -3015,15 +3064,44 @@ void LoadMusicInfo() printf("::: -> '%s' (found in directory)\n", basename); #endif - *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf)); - if (*new != NULL) - new = &(*new)->next; + if (!music_info_listed(music_file_info, basename)) + { + *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf)); + if (*new != NULL) + new = &(*new)->next; + } num_music_noconf++; } closedir(dir); + for (i = 0; i < num_sounds; i++) + { + sound = getSoundListEntry(i); + + if (sound->filename == NULL) + continue; + + if (strcmp(sound->filename, UNDEFINED_FILENAME) == 0) + continue; + + /* a configured file may be not recognized as sound */ + if (!FileIsSound(sound->filename)) + continue; + +#if 0 + printf("::: -> '%s' (configured)\n", sound->filename); +#endif + + if (!sound_info_listed(music_file_info, sound->filename)) + { + *new = get_sound_file_info(sound->filename, i); + if (*new != NULL) + new = &(*new)->next; + } + } + #if 0 /* TEST-ONLY */ for (next = music_file_info; next != NULL; next = next->next) @@ -3066,8 +3144,6 @@ void print_unknown_token_end(int token_nr) Error(ERR_RETURN_LINE, "-"); } -#if 1 - void LoadHelpAnimInfo() { char *filename = getHelpAnimFilename(); @@ -3100,16 +3176,16 @@ void LoadHelpAnimInfo() direction_hash = newSetupFileHash(); for (i = 0; i < MAX_NUM_ELEMENTS; i++) - setHashEntry(element_hash, element_info[i].token_name, itoa(i)); + setHashEntry(element_hash, element_info[i].token_name, i_to_a(i)); for (i = 0; i < NUM_ACTIONS; i++) setHashEntry(action_hash, element_action_info[i].suffix, - itoa(element_action_info[i].value)); + i_to_a(element_action_info[i].value)); /* do not store direction index (bit) here, but direction value! */ for (i = 0; i < NUM_DIRECTIONS; i++) setHashEntry(direction_hash, element_direction_info[i].suffix, - itoa(1 << element_direction_info[i].value)); + i_to_a(1 << element_direction_info[i].value)); for (list = setup_file_list; list != NULL; list = list->next) { @@ -3259,7 +3335,8 @@ void LoadHelpAnimInfo() print_unknown_token_end(num_unknown_tokens); - add_helpanim_entry(HELPANIM_LIST_END, -1, -1, -1, &num_list_entries); + add_helpanim_entry(HELPANIM_LIST_NEXT, -1, -1, -1, &num_list_entries); + add_helpanim_entry(HELPANIM_LIST_END, -1, -1, -1, &num_list_entries); freeSetupFileList(setup_file_list); freeSetupFileHash(element_hash); @@ -3277,188 +3354,6 @@ void LoadHelpAnimInfo() #endif } -#else - -void LoadHelpAnimInfo() -{ - char *filename = getHelpAnimFilename(); - SetupFileList *setup_file_list = NULL, *list; - SetupFileHash *element_hash, *action_hash, *direction_hash; - int num_list_entries = 0; - int num_unknown_tokens = 0; - int i; - - if (fileExists(filename)) - setup_file_list = loadSetupFileList(filename); - - if (setup_file_list == NULL) - { - /* use reliable default values from static configuration */ - SetupFileList *insert_ptr; - - insert_ptr = setup_file_list = - newSetupFileList(helpanim_config[0].token, - helpanim_config[0].value); - - for (i = 1; helpanim_config[i].token; i++) - insert_ptr = addListEntry(insert_ptr, - helpanim_config[i].token, - helpanim_config[i].value); - } - - element_hash = newSetupFileHash(); - action_hash = newSetupFileHash(); - direction_hash = newSetupFileHash(); - - for (i = 0; i < MAX_NUM_ELEMENTS; i++) - setHashEntry(element_hash, element_info[i].token_name, itoa(i)); - - for (i = 0; i < NUM_ACTIONS; i++) - setHashEntry(action_hash, element_action_info[i].suffix, - itoa(element_action_info[i].value)); - - /* do not store direction index (bit) here, but direction value! */ - for (i = 0; i < NUM_DIRECTIONS; i++) - setHashEntry(direction_hash, element_direction_info[i].suffix, - itoa(1 << element_direction_info[i].value)); - - for (list = setup_file_list; list != NULL; list = list->next) - { - char *element_token, *action_token, *direction_token; - char *element_value, *action_value, *direction_value; - int delay = atoi(list->value); - - if (strcmp(list->token, "end") == 0) - { - add_helpanim_entry(HELPANIM_LIST_NEXT, -1, -1, -1, &num_list_entries); - - continue; - } - - element_token = list->token; - element_value = getHashEntry(element_hash, element_token); - - if (element_value != NULL) - { - /* element found */ - add_helpanim_entry(atoi(element_value), -1, -1, delay,&num_list_entries); - - continue; - } - - if (strchr(element_token, '.') == NULL) - { - /* no further suffixes found -- this is not an element */ - print_unknown_token(filename, list->token, num_unknown_tokens++); - - continue; - } - - action_token = strchr(element_token, '.'); - element_token = getStringCopy(element_token); - *strchr(element_token, '.') = '\0'; - - element_value = getHashEntry(element_hash, element_token); - - if (element_value == NULL) - { - /* this is not an element */ - print_unknown_token(filename, list->token, num_unknown_tokens++); - free(element_token); - - continue; - } - - action_value = getHashEntry(action_hash, action_token); - - if (action_value != NULL) - { - /* action found */ - add_helpanim_entry(atoi(element_value), atoi(action_value), -1, delay, - &num_list_entries); - free(element_token); - - continue; - } - - direction_token = action_token; - direction_value = getHashEntry(direction_hash, direction_token); - - if (direction_value != NULL) - { - /* direction found */ - add_helpanim_entry(atoi(element_value), -1, atoi(direction_value), delay, - &num_list_entries); - free(element_token); - - continue; - } - - if (strchr(action_token + 1, '.') == NULL) - { - /* no further suffixes found -- this is not an action or direction */ - print_unknown_token(filename, list->token, num_unknown_tokens++); - free(element_token); - - continue; - } - - direction_token = strchr(action_token + 1, '.'); - action_token = getStringCopy(action_token); - *strchr(action_token + 1, '.') = '\0'; - - action_value = getHashEntry(action_hash, action_token); - - if (action_value == NULL) - { - /* this is not an action */ - print_unknown_token(filename, list->token, num_unknown_tokens++); - free(element_token); - free(action_token); - - continue; - } - - direction_value = getHashEntry(direction_hash, direction_token); - - if (direction_value != NULL) - { - /* direction found */ - add_helpanim_entry(atoi(element_value), atoi(action_value), - atoi(direction_value), delay, &num_list_entries); - free(element_token); - free(action_token); - - continue; - } - - print_unknown_token(filename, list->token, num_unknown_tokens++); - - free(element_token); - free(action_token); - } - - print_unknown_token_end(num_unknown_tokens); - - add_helpanim_entry(HELPANIM_LIST_END, -1, -1, -1, &num_list_entries); - - freeSetupFileList(setup_file_list); - freeSetupFileHash(element_hash); - freeSetupFileHash(action_hash); - freeSetupFileHash(direction_hash); - -#if 0 - /* TEST ONLY */ - for (i = 0; i < num_list_entries; i++) - printf("::: %d, %d, %d => %d\n", - helpanim_info[i].element, - helpanim_info[i].action, - helpanim_info[i].direction, - helpanim_info[i].delay); -#endif -} -#endif - void LoadHelpTextInfo() { char *filename = getHelpTextFilename();