+ levels_path = FileSystem::dirname(map_filename);
+
+ try {
+ lisp::Parser parser;
+ std::auto_ptr<lisp::Lisp> root (parser.parse(map_filename));
+
+ const lisp::Lisp* lisp = root->get_lisp("supertux-worldmap");
+ if(!lisp)
+ throw std::runtime_error("file isn't a supertux-worldmap file.");
+
+ clear_objects();
+ lisp::ListIterator iter(lisp);
+ while(iter.next()) {
+ if(iter.item() == "tilemap") {
+ add_object(new TileMap(*(iter.lisp()), tile_manager));
+ } else if(iter.item() == "background") {
+ add_object(new Background(*(iter.lisp())));
+ } else if(iter.item() == "properties") {
+ const lisp::Lisp* props = iter.lisp();
+ props->get("name", name);
+ props->get("music", music);
+ } else if(iter.item() == "intro-script") {
+ iter.value()->get(intro_script);
+ } else if(iter.item() == "spawnpoint") {
+ SpawnPoint* sp = new SpawnPoint(iter.lisp());
+ spawn_points.push_back(sp);
+ } else if(iter.item() == "level") {
+ parse_level_tile(iter.lisp());
+ } else if(iter.item() == "special-tile") {
+ parse_special_tile(iter.lisp());
+ } else {
+ std::cerr << "Unknown token '" << iter.item() << "' in worldmap.\n";
+ }
+ }
+ if(solids == 0)
+ throw std::runtime_error("No solid tilemap specified");
+
+ // search for main spawnpoint
+ for(SpawnPoints::iterator i = spawn_points.begin();
+ i != spawn_points.end(); ++i) {
+ SpawnPoint* sp = *i;
+ if(sp->name == "main") {
+ Vector p = sp->pos;
+ tux->set_tile_pos(p);
+ break;
+ }
+ }
+
+ } catch(std::exception& e) {
+ std::stringstream msg;
+ msg << "Problem when parsing worldmap '" << map_filename << "': " <<
+ e.what();
+ throw std::runtime_error(msg.str());
+ }
+}
+
+void
+WorldMap::parse_special_tile(const lisp::Lisp* lisp)
+{
+ SpecialTile special_tile;