X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Flevel.cpp;h=b5ef146f506462a98bcf0500404ecf9ff79b0752;hb=af79f0712f972a0730f8a0220f927b22d568a196;hp=8aaba2024a10c8e558bb1e9244f10ba4e0ab7ec8;hpb=82895aabbae07b59a19e09a61ca94cd7b1603702;p=supertux.git diff --git a/src/level.cpp b/src/level.cpp index 8aaba2024..b5ef146f5 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -38,6 +38,8 @@ #include "physic.hpp" #include "sector.hpp" #include "tile.hpp" +#include "tile_set.hpp" +#include "tile_manager.hpp" #include "resources.hpp" #include "file_system.hpp" #include "object/gameobjs.hpp" @@ -49,10 +51,18 @@ using namespace std; Level::Level() - : name("noname"), author("Mr. X") + : name("noname"), author("Mr. X"), tileset(NULL), free_tileset(false) { } +Level::~Level() +{ + for(Sectors::iterator i = sectors.begin(); i != sectors.end(); ++i) + delete *i; + if(free_tileset) + delete tileset; +} + void Level::load(const std::string& filepath) { @@ -71,6 +81,28 @@ Level::load(const std::string& filepath) return; } + const lisp::Lisp* tilesets_lisp = level->get_lisp("tilesets"); + if(tilesets_lisp != NULL) { + tileset = tile_manager->parse_tileset_definition(*tilesets_lisp); + free_tileset = true; + } + std::string tileset_name; + if(level->get("tileset", tileset_name)) { + if(tileset != NULL) { + log_warning << "multiple tilesets specified in level" << std::endl; + } else { + tileset = tile_manager->get_tileset(tileset_name); + } + } + /* load default tileset */ + if(tileset == NULL) { + tileset = tile_manager->get_tileset("images/tiles.strf"); + } + current_tileset = tileset; + + contact = ""; + license = ""; + lisp::ListIterator iter(level); while(iter.next()) { const std::string& token = iter.item(); @@ -79,10 +111,16 @@ Level::load(const std::string& filepath) if(version > 2) { log_warning << "level format newer than application" << std::endl; } + } else if(token == "tileset" || token == "tilesets") { + continue; } else if(token == "name") { iter.value()->get(name); } else if(token == "author") { iter.value()->get(author); + } else if(token == "contact") { + iter.value()->get(contact); + } else if(token == "license") { + iter.value()->get(license); } else if(token == "on-menukey-script") { iter.value()->get(on_menukey_script); } else if(token == "sector") { @@ -94,11 +132,17 @@ Level::load(const std::string& filepath) } } + if (license == "") { + log_warning << "The level author did not specify a license for this level. You might not be allowed to share it." << std::endl; + + } } catch(std::exception& e) { std::stringstream msg; msg << "Problem when reading level '" << filepath << "': " << e.what(); throw std::runtime_error(msg.str()); } + + current_tileset = NULL; } void @@ -141,12 +185,6 @@ Level::save(const std::string& filename) delete writer; } -Level::~Level() -{ - for(Sectors::iterator i = sectors.begin(); i != sectors.end(); ++i) - delete *i; -} - void Level::add_sector(Sector* sector) {