From: Ingo Ruhnke Date: Tue, 15 Jun 2004 12:18:59 +0000 (+0000) Subject: - change subimage loading syntax to be more usefull, ie. now its (images "somefile... X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=192c17906bbfdc1319ae0fb5ec9d5f1259742221;p=supertux.git - change subimage loading syntax to be more usefull, ie. now its (images "somefile" (region "somefile" 0 0 32 32") "someotherfile") SVN-Revision: 1492 --- diff --git a/src/lispreader.cpp b/src/lispreader.cpp index d9bcf4f2b..3a0c7b10e 100644 --- a/src/lispreader.cpp +++ b/src/lispreader.cpp @@ -1102,14 +1102,10 @@ LispReader::read_lisp(const char* name, lisp_object_t*& b) return true; } -LispReader* +lisp_object_t* LispReader::read_lisp(const char* name) { - lisp_object_t* obj = search_for(name); - if(!obj) - return 0; - - return new LispReader(obj); + return search_for(name); } bool diff --git a/src/lispreader.h b/src/lispreader.h index b90692514..33aad4f2f 100644 --- a/src/lispreader.h +++ b/src/lispreader.h @@ -192,7 +192,7 @@ public: bool read_float(const char* name, float& f); bool read_bool(const char* name, bool& b); bool read_lisp(const char* name, lisp_object_t*& b); - LispReader* read_lisp(const char* name); + lisp_object_t* read_lisp(const char* name); static LispReader* load(const std::string& filename, const std::string& toplevellist); diff --git a/src/tile.cpp b/src/tile.cpp index bdb82b14f..964686b00 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -28,6 +28,74 @@ #include "vector.h" #include "screen/drawing_context.h" +/** Dirty little helper to create a surface from a snipped of lisp: + * + * "filename" + * (region "filename" x y w h) + */ +static +Surface* create_surface(lisp_object_t* cur) +{ + if (lisp_string_p(cur)) + { + return new Surface(datadir + "/images/tilesets/" + lisp_string(cur), + USE_ALPHA); + } + else if (lisp_cons_p(cur) && lisp_symbol_p(lisp_car(cur))) + { + lisp_object_t* sym = lisp_car(cur); + lisp_object_t* data = lisp_cdr(cur); + + if (strcmp(lisp_symbol(sym), "region") == 0) + { + if (lisp_list_length(data) == 5) // (image-region filename x y w h) + { + return new Surface(datadir + "/images/tilesets/" + lisp_string(lisp_car(data)), + lisp_integer(lisp_list_nth(data, 1)), + lisp_integer(lisp_list_nth(data, 2)), + lisp_integer(lisp_list_nth(data, 3)), + lisp_integer(lisp_list_nth(data, 4)), + USE_ALPHA); + } + else + { + std::cout << "Tile: Type mispatch, should be '(region \"somestring\" x y w h)'" << std::endl; + return 0; + } + } + else + { + std::cout << "Tile: Unhandled tag: " << lisp_symbol(sym) << std::endl; + return 0; + } + } + + std::cout << "Tile: unhandled element" << std::endl; + return 0; +} + +/** Create a vector of surfaces (aka Sprite) from a piece of lisp: + ((image "bla.png") (image-region "bla.png") ...) + */ +static +std::vector create_surfaces(lisp_object_t* cur) +{ + std::vector surfs; + + while(cur) + { + Surface* surface = create_surface(lisp_car(cur)); + if (surface) + surfs.push_back(surface); + else + std::cout << "Tile: Couldn't create image" << std::endl; + + cur = lisp_cdr(cur); + } + + return surfs; +} + Tile::Tile() : id(-1), attributes(0), data(0), next_tile(0), anim_speed(25) { @@ -79,38 +147,9 @@ Tile::read(LispReader& reader) reader.read_int("anim-speed", anim_speed); reader.read_int("next-tile", next_tile); - std::vector filenames; - reader.read_string_vector("images", filenames); - std::vector editor_filenames; - reader.read_string_vector("editor-images", editor_filenames); - - std::vector grid; - reader.read_int_vector("grid", grid); - - // read images - for(std::vector::iterator i = filenames.begin(); - i != filenames.end(); ++i) - { - if (grid.size() == 4) - { - Surface* surface = new Surface(datadir + "/images/tilesets/" + *i, - grid[0], grid[1], grid[2], grid[3], - USE_ALPHA); - images.push_back(surface); - } - else - { - Surface* surface = new Surface(datadir + "/images/tilesets/" + *i, USE_ALPHA); - images.push_back(surface); - } - } - - for(std::vector::iterator i = editor_filenames.begin(); - i != editor_filenames.end(); ++i) { - Surface* surface - = new Surface(datadir + "/images/tilesets/" + *i, USE_ALPHA); - editor_images.push_back(surface); - } + // FIXME: make images and editor_images a sprite + images = create_surfaces(reader.read_lisp("images")); + editor_images = create_surfaces(reader.read_lisp("editor-images")); return id; }