X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite_manager.cpp;h=33e85c2e657b3ab9ab29c5f1c51d0af557d21ada;hb=8e0bad9f82ccbc811a18edd7ce6c6f69c5bca082;hp=195130ee04789ec191ab9b97ea8ba0417be7dd98;hpb=7871814a4dcd222f4f703f6fa9c9ff5b38d7d8d7;p=supertux.git diff --git a/lib/special/sprite_manager.cpp b/lib/special/sprite_manager.cpp index 195130ee0..33e85c2e6 100644 --- a/lib/special/sprite_manager.cpp +++ b/lib/special/sprite_manager.cpp @@ -16,13 +16,21 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include #include +#include +#include -#include "../utils/lispreader.h" -#include "../special/sprite_manager.h" +#include "sprite_manager.h" +#include "sprite_data.h" +#include "sprite.h" +#include "lisp/lisp.h" +#include "lisp/parser.h" +#include "lisp/list_iterator.h" -using namespace SuperTux; +namespace SuperTux +{ SpriteManager::SpriteManager(const std::string& filename) { @@ -31,8 +39,7 @@ SpriteManager::SpriteManager(const std::string& filename) SpriteManager::~SpriteManager() { - for(std::map::iterator i = sprites.begin(); - i != sprites.end(); ++i) { + for(Sprites::iterator i = sprites.begin(); i != sprites.end(); ++i) { delete i->second; } } @@ -40,60 +47,51 @@ SpriteManager::~SpriteManager() void SpriteManager::load_resfile(const std::string& filename) { - lisp_object_t* root_obj = lisp_read_from_file(filename); - if (!root_obj) - { - std::cout << "SpriteManager: Couldn't load: " << filename << std::endl; - return; - } - - lisp_object_t* cur = root_obj; + lisp::Parser parser; + try { + std::auto_ptr root (parser.parse(filename)); - if (strcmp(lisp_symbol(lisp_car(cur)), "supertux-resources") != 0) - return; - cur = lisp_cdr(cur); + const lisp::Lisp* resources = root->get_lisp("supertux-resources"); + if(!resources) + throw std::runtime_error("file is not a supertux-resources files"); - while(cur) - { - lisp_object_t* el = lisp_car(cur); + lisp::ListIterator iter(resources); + while(iter.next()) { + if(iter.item() == "sprite") { + SpriteData* spritedata = new SpriteData(iter.lisp()); - if (strcmp(lisp_symbol(lisp_car(el)), "sprite") == 0) - { - Sprite* sprite = new Sprite(lisp_cdr(el)); - - Sprites::iterator i = sprites.find(sprite->get_name()); - if (i == sprites.end()) - { - sprites[sprite->get_name()] = sprite; - } - else - { - delete i->second; - i->second = sprite; - std::cout << "Warning: dulpicate entry: '" << sprite->get_name() << "'" << std::endl; - } - } - else - { - std::cout << "SpriteManager: Unknown tag" << std::endl; + Sprites::iterator i = sprites.find(spritedata->get_name()); + if (i == sprites.end()) { + sprites[spritedata->get_name()] = spritedata; + } else { + delete i->second; + i->second = spritedata; + std::cout << "Warning: dulpicate entry: '" << spritedata->get_name() + << "' in spritefile." << std::endl; } - - cur = lisp_cdr(cur); + } else { + std::cout << "SpriteManager: Unknown tag '" << iter.item() + << "' in spritefile.\n"; + } } - - lisp_free(root_obj); + } catch(std::exception& e) { + std::stringstream msg; + msg << "Couldn't load file '" << filename << "': " << e.what() << "\n"; + throw std::runtime_error(msg.str()); + } } Sprite* -SpriteManager::load(const std::string& name) +SpriteManager::create(const std::string& name) { Sprites::iterator i = sprites.find(name); - if (i == sprites.end()) - { - std::cerr << "Warning: Sprite '" << name << "' not found" << std::endl; - return 0; - } - return i->second; + if(i == sprites.end()) { + std::stringstream msg; + msg << "Sprite '" << name << "' not found."; + throw std::runtime_error(msg.str()); + } + return new Sprite(*i->second); +} + } -/* EOF */