void Level::load(const std::string& filepath) { try { lisp::Parser parser; std::auto_ptr<lisp::Lisp> root (parser.parse(filepath)); const lisp::Lisp* level = root->get_lisp("supertux-level"); if(!level) throw std::runtime_error("file is not a supertux-level file."); int version = 1; level->get("version", version); if(version == 1) { load_old_format(*level); return; } lisp::ListIterator iter(level); while(iter.next()) { const std::string& token = iter.item(); if(token == "version") { iter.value()->get(version); if(version > 2) { log_warning << "level format newer than application" << std::endl; } } else if(token == "name") { iter.value()->get(name); } else if(token == "author") { iter.value()->get(author); } else if(token == "on-menukey-script") { iter.value()->get(on_menukey_script); } else if(token == "sector") { Sector* sector = new Sector(this); sector->parse(*(iter.lisp())); add_sector(sector); } else { log_warning << "Unknown token '" << token << "' in level file" << std::endl; continue; } } } catch(std::exception& e) { std::stringstream msg; msg << "Problem when reading level '" << filepath << "': " << e.what(); throw std::runtime_error(msg.str()); } }