- std::cout << "Loading map: " << datadir + "/levels/worldmap/" + map_filename << std::endl;
-
- lisp_object_t* root_obj = lisp_read_from_file(datadir + "/levels/worldmap/" + map_filename);
- if (!root_obj)
- st_abort("Couldn't load file", datadir + "/levels/worldmap/" + map_filename);
-
- if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-worldmap") == 0)
- {
- lisp_object_t* cur = lisp_cdr(root_obj);
-
- while(!lisp_nil_p(cur))
- {
- lisp_object_t* element = lisp_car(cur);
-
- if (strcmp(lisp_symbol(lisp_car(element)), "tilemap") == 0)
- {
- LispReader reader(lisp_cdr(element));
- reader.read_int("width", width);
- reader.read_int("height", height);
- reader.read_int_vector("data", tilemap);
- }
- else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0)
- {
- LispReader reader(lisp_cdr(element));
- reader.read_string("name", name, true);
- reader.read_string("music", music);
- reader.read_int("start_pos_x", start_x);
- reader.read_int("start_pos_y", start_y);
- }
- else if (strcmp(lisp_symbol(lisp_car(element)), "levels") == 0)
- {
- lisp_object_t* cur = lisp_cdr(element);
-
- while(!lisp_nil_p(cur))
- {
- lisp_object_t* element = lisp_car(cur);
-
- if (strcmp(lisp_symbol(lisp_car(element)), "level") == 0)
- {
- Level level;
- LispReader reader(lisp_cdr(element));
- level.solved = false;
-
- level.north = true;
- level.east = true;
- level.south = true;
- level.west = true;
-
- reader.read_string("extro-filename", level.extro_filename);
- reader.read_string("name", level.name, true);
- reader.read_int("x", level.x);
- reader.read_int("y", level.y);
- level.vertical_flip = false;
- reader.read_bool("flip", level.vertical_flip);
-
- levels.push_back(level);
- }
-
- cur = lisp_cdr(cur);
- }
- }
- else
- {
-
- }
-
- cur = lisp_cdr(cur);
- }
+ levels_path = FileSystem::dirname(map_filename);
+
+ try {
+ lisp::Parser parser;
+ std::string filename = get_resource_filename(map_filename);
+ std::auto_ptr<lisp::Lisp> root (parser.parse(filename));
+
+ const lisp::Lisp* lisp = root->get_lisp("supertux-worldmap");
+ if(!lisp)
+ throw new std::runtime_error("file isn't a supertux-worldmap file.");
+
+ lisp::ListIterator iter(lisp);
+ while(iter.next()) {
+ if(iter.item() == "tilemap") {
+ if(tilemap.size() > 0)
+ throw new std::runtime_error("multiple tilemaps specified");
+
+ const lisp::Lisp* tilemap_lisp = iter.lisp();
+ tilemap_lisp->get("width", width);
+ tilemap_lisp->get("height", height);
+ tilemap_lisp->get_vector("data", tilemap);
+ } else if(iter.item() == "properties") {
+ const lisp::Lisp* props = iter.lisp();
+ props->get("name", name);
+ props->get("music", music);
+ props->get("intro-filename", intro_filename);
+ props->get("start_pos_x", start_x);
+ props->get("start_pos_y", start_y);
+ } else if(iter.item() == "special-tiles") {
+ parse_special_tiles(iter.lisp());
+ } else {
+ std::cerr << "Unknown token '" << iter.item() << "' in worldmap.\n";
+ }