X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Flevel_subset.cpp;h=2366f8cf18469704b09af5574421638f62da56a7;hb=2b18d7e2549f4be99533fed58c0f07887a19db37;hp=5cd4d2abd4f7836fb2b8658c8b03303653c15b99;hpb=d5f3984577afe481c7e0596d3a01f86c8ae83945;p=supertux.git diff --git a/src/level_subset.cpp b/src/level_subset.cpp index 5cd4d2abd..2366f8cf1 100644 --- a/src/level_subset.cpp +++ b/src/level_subset.cpp @@ -17,16 +17,19 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. +#include +#include +#include #include #include -#include "app/setup.h" #include "level.h" -#include "app/globals.h" +#include "resources.h" +#include "file_system.h" #include "video/surface.h" #include "level_subset.h" - -using namespace SuperTux; +#include "lisp/parser.h" +#include "lisp/lisp.h" static bool has_suffix(const std::string& data, const std::string& suffix) { @@ -52,28 +55,25 @@ void LevelSubset::create(const std::string& subset_name) new_subset.name = subset_name; new_subset.title = "Unknown Title"; new_subset.description = "No description so far."; + new_subset.hide_from_contribs = false; new_subset.save(); } void LevelSubset::read_info_file(const std::string& info_file) { - lisp_object_t* root_obj = lisp_read_from_file(info_file); - lisp_object_t* cur = lisp_car(root_obj); + lisp::Parser parser; + std::auto_ptr root (parser.parse(info_file)); - if (lisp_symbol_p(cur) && strcmp(lisp_symbol(cur), "supertux-level-subset") == 0) - { - LispReader reader(lisp_cdr(root_obj)); + const lisp::Lisp* info = root->get_lisp("supertux-level-subset"); + if(!info) + throw std::runtime_error("File is not a levelsubset file"); - reader.read_string("title", title, true); - reader.read_string("description", description, true); - reader.read_string_vector("levels", levels); - } - else - { - std::cout << "LevelSubset: parse error in info file: " << info_file << std::endl; - } + hide_from_contribs = false; - lisp_free(root_obj); + info->get("title", title); + info->get("description", description); + info->get_vector("levels", levels); + info->get("hide-from-contribs", hide_from_contribs); } void LevelSubset::load(const std::string& subset) @@ -82,43 +82,47 @@ void LevelSubset::load(const std::string& subset) // Check in which directory our subset is located (ie. ~/.supertux/ // or SUPERTUX_DATADIR) - std::string filename; - filename = st_dir + "/levels/" + subset + "/"; - if (access(filename.c_str(), R_OK) == 0) - { - directory = filename; - } - else - { - filename = datadir + "/levels/" + subset + "/"; - if (access(filename.c_str(), R_OK) == 0) - directory = filename; - else - std::cout << "Error: LevelSubset: couldn't find subset: " << subset << std::endl; - } - - read_info_file(directory + "info"); + 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 files; - filename = st_dir + "/levels/" + subset + "/"; - if(access(filename.c_str(), R_OK) == 0) - { - files = FileSystem::read_directory(filename); - } - else - { - filename = datadir + "/levels/" + subset + "/"; - files = FileSystem::read_directory(filename); - } + filename = datadir + "/levels/" + subset + "/"; + files = FileSystem::read_directory(filename); + + filename = user_dir + "/levels/" + subset + "/"; + std::set user_files = FileSystem::read_directory(filename); + files.insert(user_files.begin(), user_files.end()); for(std::set::iterator i = files.begin(); i != files.end(); ++i) { if (has_suffix(*i, ".stl")) - levels.push_back(*i); + levels.push_back(get_resource_filename( + std::string("levels/" + subset+ "/" + *i))); } } } @@ -133,7 +137,7 @@ LevelSubset::save() filename = "/levels/" + name + "/"; FileSystem::fcreatedir(filename.c_str()); - filename = std::string(st_dir) + "/levels/" + name + "/info"; + filename = std::string(user_dir) + "/levels/" + name + "/info"; if(!FileSystem::fwriteable(filename.c_str())) filename = datadir + "/levels/" + name + "/info"; if(FileSystem::fwriteable(filename.c_str())) @@ -154,6 +158,9 @@ LevelSubset::save() /* Save the description: */ fprintf(fi," (description \"%s\")\n", description.c_str()); + /* Save the hide from Contrbis menu boolean: */ + fprintf(fi," (hide-from-contribs %s)\n", hide_from_contribs ? "#t" : "#f"); + fprintf( fi,")"); fclose(fi); } @@ -169,9 +176,13 @@ std::string LevelSubset::get_level_filename(unsigned int num) { assert(num < levels.size()); + return levels[num]; +} -std::cerr << "levels[" << num << "]: " << levels[num] << std::endl; - return directory + levels[num]; +std::string +LevelSubset::get_worldmap_filename() +{ + return std::string("/levels/" + name + "/worldmap.stwm"); } int @@ -179,5 +190,3 @@ LevelSubset::get_num_levels() const { return levels.size(); } - -/* EOF */