-
- 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)
- {
- perror(filename);
- }
- lisp_stream_t stream;
- lisp_stream_init_file (&stream, fi);
- root_obj = lisp_read (&stream);
-
- if (root_obj->type == LISP_TYPE_EOF || root_obj->type == LISP_TYPE_PARSE_ERROR)
- {
- printf("World: Parse Error in file %s", filename);
- }
-
- lisp_object_t* cur = lisp_car(root_obj);
-
- if (!lisp_symbol_p (cur))
- {
- printf("World: Read error in %s",filename);
- }
-
- if (strcmp(lisp_symbol(cur), "supertux-level-subset") == 0)
- {
- parse(lisp_cdr(root_obj));
-
- }
-
- lisp_free(root_obj);
- fclose(fi);
-
- snprintf(str, 1024, "%s.png", filename);
- if(faccessible(str))
- {
- delete image;
- image = new Surface(str,IGNORE_ALPHA);
- }
- else
- {
- snprintf(filename, 1024, "%s/images/status/level-subset-info.png", datadir.c_str());
- delete image;
- image = new Surface(filename,IGNORE_ALPHA);
- }
+
+ std::string infofile = subset + "/info";
+ try {
+ read_info_file(infofile);
+ } catch(std::exception& e) {
+ std::stringstream msg;
+ msg << "Couldn't parse info file '" << infofile << "': " << e.what();
+ throw std::runtime_error(msg.str());
+ }
+
+ // test is a worldmap exists
+ has_worldmap = false;
+ std::string worldmap = subset + "/worldmap.stwm";
+ if(PHYSFS_exists(worldmap.c_str())) {
+ 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::string path = subset + "/";
+ char** files = PHYSFS_enumerateFiles(path.c_str());
+ if(!files) {
+ std::cerr << "Warning: Couldn't read subset dir '"
+ << path << "'.\n";
+ return;