-
- snprintf(filename, 1024, "%s/levels/%s/info", st_dir, subset);
- if(!faccessible(filename))
- snprintf(filename, 1024, "%s/levels/%s/info", datadir.c_str(), subset);
- if(faccessible(filename))
- {
- fi = fopen(filename, "r");
- if (fi == NULL)
+
+ // Check in which directory our subset is located (ie. ~/.supertux/
+ // or SUPERTUX_DATADIR)
+ std::string filename = get_resource_filename(
+ std::string("levels/") + subset + "/info");
+ if(filename == "") {
+ std::stringstream msg;
+ msg << "Couldn't find level subset '" << subset << "'.";
+ throw new std::runtime_error(msg.str());
+ }
+
+ try {
+ read_info_file(filename);
+ } catch(std::exception& e) {
+ std::stringstream msg;
+ msg << "Couldn't parse info file '" << filename << "': " << e.what();
+ throw new std::runtime_error(msg.str());
+ }
+
+ // test is a worldmap exists
+ has_worldmap = false;
+ std::string worldmap = get_resource_filename(
+ std::string("levels/") + subset + "/worldmap.stwm");
+ if(worldmap != "") {
+ has_worldmap = true;
+ }
+
+ if (levels.empty())
+ { // Level info file doesn't define any levels, so read the
+ // directory to see what we can find
+ std::set<std::string> files;
+
+ filename = datadir + "/levels/" + subset + "/";
+ files = FileSystem::read_directory(filename);
+
+ filename = st_dir + "/levels/" + subset + "/";
+ std::set<std::string> user_files = FileSystem::read_directory(filename);
+ files.insert(user_files.begin(), user_files.end());
+
+ for(std::set<std::string>::iterator i = files.begin(); i != files.end(); ++i)