4 // Copyright (C) 2004 SuperTux Development Team, see AUTHORS for details
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 #include "app/setup.h"
25 #include "app/globals.h"
26 #include "video/surface.h"
27 #include "level_subset.h"
29 using namespace SuperTux;
31 static bool has_suffix(const std::string& data, const std::string& suffix)
33 if (data.length() >= suffix.length())
34 return data.compare(data.length() - suffix.length(), suffix.length(), suffix) == 0;
39 LevelSubset::LevelSubset()
44 LevelSubset::~LevelSubset()
48 void LevelSubset::create(const std::string& subset_name)
51 LevelSubset new_subset;
52 new_subset.name = subset_name;
53 new_subset.title = "Unknown Title";
54 new_subset.description = "No description so far.";
55 new_subset.hide_from_contribs = false;
59 void LevelSubset::read_info_file(const std::string& info_file)
61 lisp_object_t* root_obj = lisp_read_from_file(info_file);
62 lisp_object_t* cur = lisp_car(root_obj);
64 if (lisp_symbol_p(cur) && strcmp(lisp_symbol(cur), "supertux-level-subset") == 0)
66 LispReader reader(lisp_cdr(root_obj));
68 reader.read_string("title", title, true);
69 reader.read_string("description", description, true);
70 reader.read_string_vector("levels", levels);
71 hide_from_contribs = false;
72 reader.read_bool("hide-from-contribs", hide_from_contribs);
76 std::cout << "LevelSubset: parse error in info file: " << info_file << std::endl;
82 void LevelSubset::load(const std::string& subset)
86 // Check in which directory our subset is located (ie. ~/.supertux/
87 // or SUPERTUX_DATADIR)
89 filename = st_dir + "/levels/" + subset + "/";
90 if (access(filename.c_str(), R_OK) == 0)
96 filename = datadir + "/levels/" + subset + "/";
97 if (access(filename.c_str(), R_OK) == 0)
100 std::cout << "Error: LevelSubset: couldn't find subset: " << subset << std::endl;
103 read_info_file(directory + "info");
106 { // Level info file doesn't define any levels, so read the
107 // directory to see what we can find
108 std::set<std::string> files;
110 filename = st_dir + "/levels/" + subset + "/";
111 if(access(filename.c_str(), R_OK) == 0)
113 files = FileSystem::read_directory(filename);
117 filename = datadir + "/levels/" + subset + "/";
118 files = FileSystem::read_directory(filename);
121 for(std::set<std::string>::iterator i = files.begin(); i != files.end(); ++i)
123 if (has_suffix(*i, ".stl"))
124 levels.push_back(*i);
133 std::string filename;
135 /* Save data file: */
136 filename = "/levels/" + name + "/";
138 FileSystem::fcreatedir(filename.c_str());
139 filename = std::string(st_dir) + "/levels/" + name + "/info";
140 if(!FileSystem::fwriteable(filename.c_str()))
141 filename = datadir + "/levels/" + name + "/info";
142 if(FileSystem::fwriteable(filename.c_str()))
144 fi = fopen(filename.c_str(), "w");
147 perror(filename.c_str());
151 fprintf(fi,";; SuperTux-Level-Subset\n");
152 fprintf(fi,"(supertux-level-subset\n");
154 /* Save title info: */
155 fprintf(fi," (title \"%s\")\n", title.c_str());
157 /* Save the description: */
158 fprintf(fi," (description \"%s\")\n", description.c_str());
160 /* Save the hide from Contrbis menu boolean: */
161 fprintf(fi," (hide-from-contribs \"%s\")\n", hide_from_contribs ? "#t" : "#f");
169 LevelSubset::add_level(const std::string& name)
171 levels.push_back(name);
175 LevelSubset::get_level_filename(unsigned int num)
177 assert(num < levels.size());
178 return directory + levels[num];
182 LevelSubset::get_num_levels() const
184 return levels.size();