X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=7237f57722a570efe9f36d227846ae8b24400abf;hb=7ecf99096c7c23909ada034e05d971464f66552f;hp=fd0c4010c290f068d07b1f77b5254c0a71bfb018;hpb=0c6144aa1196e8121ba38716f9f95836d0ccbb9e;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index fd0c4010..7237f577 100644 --- a/src/files.c +++ b/src/files.c @@ -2090,6 +2090,48 @@ static char *getSingleLevelBasename(int nr) return getSingleLevelBasenameExt(nr, LEVELFILE_EXTENSION); } +#if 1 + +static char *getPackedLevelBasename(int type) +{ + static char basename[MAX_FILENAME_LEN]; + char *directory = getCurrentLevelDir(); + Directory *dir; + DirectoryEntry *dir_entry; + + strcpy(basename, UNDEFINED_FILENAME); /* default: undefined file */ + + if ((dir = openDirectory(directory)) == NULL) + { + Error(ERR_WARN, "cannot read current level directory '%s'", directory); + + return basename; + } + + while ((dir_entry = readDirectory(dir)) != NULL) /* loop all entries */ + { + char *entry_basename = dir_entry->basename; + int entry_type = getFileTypeFromBasename(entry_basename); + + if (entry_type != LEVEL_FILE_TYPE_UNKNOWN) /* found valid level package */ + { + if (type == LEVEL_FILE_TYPE_UNKNOWN || + type == entry_type) + { + strcpy(basename, entry_basename); + + break; + } + } + } + + closeDirectory(dir); + + return basename; +} + +#else + static char *getPackedLevelBasename(int type) { static char basename[MAX_FILENAME_LEN]; @@ -2128,6 +2170,8 @@ static char *getPackedLevelBasename(int type) return basename; } +#endif + static char *getSingleLevelFilename(int nr) { return getLevelFilenameFromBasename(getSingleLevelBasename(nr)); @@ -2584,13 +2628,21 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) { int i, x, y; int element; - int num_contents, content_xsize, content_ysize; + int num_contents; +#if 0 + int content_xsize, content_ysize; +#endif int content_array[MAX_ELEMENT_CONTENTS][3][3]; element = getMappedElement(getFile16BitBE(file)); num_contents = getFile8Bit(file); +#if 1 + getFile8Bit(file); /* content x size (unused) */ + getFile8Bit(file); /* content y size (unused) */ +#else content_xsize = getFile8Bit(file); content_ysize = getFile8Bit(file); +#endif ReadUnusedBytesFromFile(file, LEVEL_CHUNK_CNT2_UNUSED); @@ -3356,7 +3408,8 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, else /* check for pre-2.0 file format with cookie string */ { strcpy(cookie, chunk_name); - fgets(&cookie[4], MAX_LINE_LEN - 4, file); + if (fgets(&cookie[4], MAX_LINE_LEN - 4, file) == NULL) + cookie[4] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -6408,7 +6461,8 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, if (level_file_info->packed) { /* read "magic bytes" from start of file */ - fgets(magic_bytes, num_magic_bytes + 1, file); + if (fgets(magic_bytes, num_magic_bytes + 1, file) == NULL) + magic_bytes[0] = '\0'; /* check "magic bytes" for correct file format */ if (!strPrefix(magic_bytes, "DC2")) @@ -7580,10 +7634,14 @@ void LoadLevel(int nr) void LoadLevelInfoOnly(int nr) { +#if 0 char *filename; +#endif setLevelFileInfo(&level.file_info, nr); +#if 0 filename = level.file_info.filename; +#endif LoadLevelFromFileInfo(&level, &level.file_info, TRUE); } @@ -8787,7 +8845,8 @@ void LoadTapeFromFilename(char *filename) else /* check for pre-2.0 file format with cookie string */ { strcpy(cookie, chunk_name); - fgets(&cookie[4], MAX_LINE_LEN - 4, file); + if (fgets(&cookie[4], MAX_LINE_LEN - 4, file) == NULL) + cookie[4] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -9130,7 +9189,8 @@ void LoadScore(int nr) return; /* check file identifier */ - fgets(cookie, MAX_LINE_LEN, file); + if (fgets(cookie, MAX_LINE_LEN, file) == NULL) + cookie[0] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -9143,10 +9203,12 @@ void LoadScore(int nr) for (i = 0; i < MAX_SCORE_ENTRIES; i++) { - fscanf(file, "%d", &highscore[i].Score); - fgets(line, MAX_LINE_LEN, file); + if (fscanf(file, "%d", &highscore[i].Score) == EOF) + Error(ERR_WARN, "fscanf() failed; %s", strerror(errno)); + if (fgets(line, MAX_LINE_LEN, file) == NULL) + line[0] = '\0'; - if (line[strlen(line) - 1] == '\n') + if (strlen(line) > 0 && line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; for (line_ptr = line; *line_ptr; line_ptr++) @@ -9228,8 +9290,11 @@ void SaveScore(int nr) #define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 30 #define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 31 #define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 32 +#define SETUP_TOKEN_VOLUME_SIMPLE 33 +#define SETUP_TOKEN_VOLUME_LOOPS 34 +#define SETUP_TOKEN_VOLUME_MUSIC 35 -#define NUM_GLOBAL_SETUP_TOKENS 33 +#define NUM_GLOBAL_SETUP_TOKENS 36 /* editor setup */ #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 @@ -9372,6 +9437,9 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH3,&si.override_level_graphics, "override_level_graphics" }, { TYPE_SWITCH3,&si.override_level_sounds, "override_level_sounds" }, { TYPE_SWITCH3,&si.override_level_music, "override_level_music" }, + { TYPE_INTEGER,&si.volume_simple, "volume_simple" }, + { TYPE_INTEGER,&si.volume_loops, "volume_loops" }, + { TYPE_INTEGER,&si.volume_music, "volume_music" }, }; static boolean not_used = FALSE; @@ -9542,6 +9610,10 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->override_level_sounds = FALSE; si->override_level_music = FALSE; + si->volume_simple = 100; /* percent */ + si->volume_loops = 100; /* percent */ + si->volume_music = 100; /* percent */ + si->editor.el_boulderdash = TRUE; si->editor.el_emerald_mine = TRUE; si->editor.el_emerald_mine_club = TRUE; @@ -9804,7 +9876,8 @@ void SaveSetup() { /* just to make things nicer :) */ if (i == SETUP_TOKEN_PLAYER_NAME + 1 || - i == SETUP_TOKEN_GRAPHICS_SET) + i == SETUP_TOKEN_GRAPHICS_SET || + i == SETUP_TOKEN_VOLUME_SIMPLE) fprintf(file, "\n"); fprintf(file, "%s\n", getSetupLine(global_setup_tokens, "", i)); @@ -10518,6 +10591,160 @@ static boolean sound_info_listed(struct MusicFileInfo *list, char *basename) return music_info_listed_ext(list, basename, TRUE); } +#if 1 + +void LoadMusicInfo() +{ + char *music_directory = getCustomMusicDirectory(); + int num_music = getMusicListSize(); + int num_music_noconf = 0; + int num_sounds = getSoundListSize(); + Directory *dir; + DirectoryEntry *dir_entry; + struct FileInfo *music, *sound; + struct MusicFileInfo *next, **new; + int i; + + while (music_file_info != NULL) + { + next = music_file_info->next; + + 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); + + music_file_info = next; + } + + new = &music_file_info; + + for (i = 0; i < num_music; i++) + { + music = getMusicListEntry(i); + + if (music->filename == NULL) + continue; + + if (strEqual(music->filename, UNDEFINED_FILENAME)) + continue; + + /* a configured file may be not recognized as music */ + if (!FileIsMusic(music->filename)) + continue; + +#if 0 + printf("::: -> '%s' (configured)\n", music->filename); +#endif + + if (!music_info_listed(music_file_info, music->filename)) + { + *new = get_music_file_info(music->filename, i); +#if 0 + if (*new != NULL) + printf(":1: adding '%s' ['%s'] ...\n", (*new)->title, music->filename); +#endif + if (*new != NULL) + new = &(*new)->next; + } + } + + if ((dir = openDirectory(music_directory)) == NULL) + { + Error(ERR_WARN, "cannot read music directory '%s'", music_directory); + return; + } + + while ((dir_entry = readDirectory(dir)) != NULL) /* loop all entries */ + { + char *basename = dir_entry->basename; + boolean music_already_used = FALSE; + int i; + + /* skip all music files that are configured in music config file */ + for (i = 0; i < num_music; i++) + { + music = getMusicListEntry(i); + + if (music->filename == NULL) + continue; + + if (strEqual(basename, music->filename)) + { + music_already_used = TRUE; + break; + } + } + + if (music_already_used) + continue; + + if (!FileIsMusic(basename)) + continue; + +#if 0 + printf("::: -> '%s' (found in directory)\n", basename); +#endif + + if (!music_info_listed(music_file_info, basename)) + { + *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf)); +#if 0 + if (*new != NULL) + printf(":2: adding '%s' ['%s'] ...\n", (*new)->title, basename); +#endif + if (*new != NULL) + new = &(*new)->next; + } + + num_music_noconf++; + } + + closeDirectory(dir); + + for (i = 0; i < num_sounds; i++) + { + sound = getSoundListEntry(i); + + if (sound->filename == NULL) + continue; + + if (strEqual(sound->filename, UNDEFINED_FILENAME)) + 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 + for (next = music_file_info; next != NULL; next = next->next) + printf("::: title == '%s'\n", next->title); +#endif +} + +#else + void LoadMusicInfo() { char *music_directory = getCustomMusicDirectory(); @@ -10668,6 +10895,8 @@ void LoadMusicInfo() #endif } +#endif + void add_helpanim_entry(int element, int action, int direction, int delay, int *num_list_entries) {