+void LoadLevelInfo()
+{
+ DIR *dir;
+ struct stat file_status;
+ char *level_directory = options.level_directory;
+ char *directory = NULL;
+ char *filename = NULL;
+ struct SetupFileList *setup_file_list = NULL;
+ struct dirent *dir_entry;
+ int i, num_entries = 0;
+
+ if ((dir = opendir(level_directory)) == NULL)
+ Error(ERR_EXIT, "cannot read level directory '%s'", level_directory);
+
+ while (num_entries < MAX_LEVDIR_ENTRIES)
+ {
+ if ((dir_entry = readdir(dir)) == NULL) /* last directory entry */
+ break;
+
+ /* skip entries for current and parent directory */
+ if (strcmp(dir_entry->d_name, ".") == 0 ||
+ strcmp(dir_entry->d_name, "..") == 0)
+ continue;
+
+ /* find out if directory entry is itself a directory */
+ directory = getPath2(level_directory, dir_entry->d_name);
+ if (stat(directory, &file_status) != 0 || /* cannot stat file */
+ (file_status.st_mode & S_IFMT) != S_IFDIR) /* not a directory */
+ {
+ free(directory);
+ continue;
+ }
+
+ if (strlen(dir_entry->d_name) >= MAX_LEVDIR_FILENAME)
+ {
+ Error(ERR_WARN, "filename of level directory '%s' too long -- ignoring",
+ dir_entry->d_name);
+ continue;
+ }
+
+ filename = getPath2(directory, LEVELINFO_FILENAME);
+ setup_file_list = loadSetupFileList(filename);
+
+ if (setup_file_list)
+ {
+ checkSetupFileListIdentifier(setup_file_list, LEVELINFO_COOKIE);
+ setLevelDirInfoToDefaults(&leveldir[num_entries]);
+
+ ldi = leveldir[num_entries];
+ for (i=FIRST_LEVELINFO_TOKEN; i<=LAST_LEVELINFO_TOKEN; i++)
+ setSetupInfo(i, getTokenValue(setup_file_list, token_info[i].text));
+ leveldir[num_entries] = ldi;
+
+ leveldir[num_entries].filename = getStringCopy(dir_entry->d_name);
+
+ freeSetupFileList(setup_file_list);
+ num_entries++;
+ }
+ else
+ Error(ERR_WARN, "ignoring level directory '%s'", directory);
+
+ free(directory);
+ free(filename);
+ }
+
+ if (num_entries == MAX_LEVDIR_ENTRIES)
+ Error(ERR_WARN, "using %d level directories -- ignoring the rest",
+ num_entries);
+
+ closedir(dir);
+
+ num_leveldirs = num_entries;
+ leveldir_nr = 0;
+
+ if (!num_leveldirs)
+ Error(ERR_EXIT, "cannot find any valid level series in directory '%s'",
+ level_directory);
+}
+