X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftile_manager.cpp;h=e6a3a155bd4dd87b5f017bb456c77a9a90ec8847;hb=d62647592b4ccffa89794af6fa03faaced46999d;hp=7422e7c9d3e61b054f5b3e484f4a4103fcb2c2ee;hpb=7ae3aef67ad305cb9c6ed584cdac6117da9eba88;p=supertux.git diff --git a/src/tile_manager.cpp b/src/tile_manager.cpp index 7422e7c9d..e6a3a155b 100644 --- a/src/tile_manager.cpp +++ b/src/tile_manager.cpp @@ -21,14 +21,16 @@ #include #include +#include +#include #include -#include "video/drawing_context.h" -#include "lisp/lisp.h" -#include "lisp/parser.h" -#include "lisp/list_iterator.h" -#include "tile.h" -#include "tile_manager.h" -#include "resources.h" +#include "video/drawing_context.hpp" +#include "lisp/lisp.hpp" +#include "lisp/parser.hpp" +#include "lisp/list_iterator.hpp" +#include "tile.hpp" +#include "tile_manager.hpp" +#include "resources.hpp" TileManager::TileManager(const std::string& filename) { @@ -72,11 +74,56 @@ void TileManager::load_tileset(std::string filename) } tiles[tile->id] = tile; } else if(iter.item() == "tilegroup") { - TileGroup tilegroup; - const lisp::Lisp* tilegroup_lisp = iter.lisp(); - tilegroup_lisp->get("name", tilegroup.name); - tilegroup_lisp->get_vector("tiles", tilegroup.tiles); - tilegroups.insert(tilegroup); + TileGroup tilegroup; + const lisp::Lisp* tilegroup_lisp = iter.lisp(); + tilegroup_lisp->get("name", tilegroup.name); + tilegroup_lisp->get_vector("tiles", tilegroup.tiles); + tilegroups.insert(tilegroup); + } else if (iter.item() == "tiles") { + // List of ids (use 0 if the tile should be ignored) + std::vector ids; + // List of attributes of the tile + std::vector attributes; + std::string image; + + // width and height of the image in tile units, this is used for two + // purposes: + // a) so we don't have to load the image here to know its dimensions + // b) so that the resulting 'tiles' entry is more robust, + // ie. enlarging the image won't break the tile id mapping + // FIXME: height is actually not used, since width might be enough for + // all purposes, still feels somewhat more natural this way + unsigned int width = 0; + unsigned int height = 0; + + iter.lisp()->get_vector("ids", ids); + iter.lisp()->get_vector("attributes", attributes); + iter.lisp()->get("image", image); + iter.lisp()->get("width", width); + iter.lisp()->get("height", height); + + if (ids.size() != attributes.size()) + { + std::ostringstream err; + err << "Number of ids (" << ids.size() << ") and attributes (" << attributes.size() + << ") missmatch for image '" << image << "', but must be equal"; + throw std::runtime_error(err.str()); + } + + for(std::vector::size_type i = 0; i < ids.size() && i < width*height; ++i) + { + if (ids[i]) + { + if(ids[i] >= tiles.size()) + tiles.resize(ids[i]+1, 0); + + int x = 32*(i % width); + int y = 32*(i / width); + Tile* tile = new Tile(ids[i], attributes[i], Tile::ImageSpec(image, Rect(x, y, x + 32, y + 32))); + tiles[ids[i]] = tile; + } + } + } else if(iter.item() == "properties") { // deprecated } else {