[Super-tux-commit] supertux/lib/special sprite.h,1.19,1.20 sprite_data.cpp,1.2,1.3 sprite_data.h,1.2
Brought to you by:
wkendrick
From: Matze B. <mat...@us...> - 2004-11-28 14:57:39
|
Update of /cvsroot/super-tux/supertux/lib/special In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13367/lib/special Modified Files: sprite.h sprite_data.cpp sprite_data.h sprite_manager.cpp Log Message: move over rewritten lispreader from tuxkart (with additional fixes), generalized TileManager and Tile classes and use them for the worldmap too Index: sprite_data.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/lib/special/sprite_data.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- sprite_data.cpp 24 Nov 2004 14:10:23 -0000 1.2 +++ sprite_data.cpp 28 Nov 2004 14:56:48 -0000 1.3 @@ -27,6 +27,7 @@ #include "app/globals.h" #include "app/setup.h" #include "video/drawing_context.h" +#include "lisp/list_iterator.h" namespace SuperTux { @@ -46,21 +47,18 @@ delete *i; } -SpriteData::SpriteData(lisp_object_t* cur) +SpriteData::SpriteData(const lisp::Lisp* lisp) { - for(; !lisp_nil_p(cur); cur = lisp_cdr(cur)) { - std::string token = lisp_symbol(lisp_car(lisp_car(cur))); - lisp_object_t* data = lisp_car(lisp_cdr(lisp_car(cur))); - LispReader reader(lisp_cdr(lisp_car(cur))); - - if(token == "name") - name = lisp_string(data); - else if(token == "action") - parse_action(reader); - else - std::cerr << "Warning: Unknown sprite field: " << token << std::endl; + lisp::ListIterator iter(lisp); + while(iter.next()) { + if(iter.item() == "name") { + iter.value()->get(name); + } else if(iter.item() == "action") { + parse_action(iter.lisp()); + } else { + std::cerr << "Unknown sprite field: " << iter.item() << "\n"; + } } - if(name.empty()) throw std::runtime_error("Error: Sprite wihtout name."); if(actions.empty()) @@ -74,21 +72,22 @@ } void -SpriteData::parse_action(LispReader& lispreader) +SpriteData::parse_action(const lisp::Lisp* lisp) { Action* action = new Action; - if(!lispreader.read_string("name", action->name)) { + if(!lisp->get("name", action->name)) { if(!actions.empty()) throw std::runtime_error( "If there are more than one action, they need names!"); } - lispreader.read_int("x-offset", action->x_offset); - lispreader.read_int("y-offset", action->y_offset); - lispreader.read_int("z-order", action->z_order); - lispreader.read_float("fps", action->fps); + lisp->get("x-offset", action->x_offset); + lisp->get("y-offset", action->y_offset); + lisp->get("z-order", action->z_order); + lisp->get("fps", action->fps); - /* TODO: add a top filter entry */ + // this doesn't seem to be used and implemented +#if 0 std::vector <int> mask_color; lispreader.read_int_vector("apply-mask", mask_color); if(mask_color.size() == 4) { @@ -97,9 +96,10 @@ (*i)->apply_filter(MASK_FILTER, Color(mask_color)); } } +#endif std::string mirror_action; - lispreader.read_string("mirror-action", mirror_action); + lisp->get("mirror-action", mirror_action); if(!mirror_action.empty()) { Action* act_tmp = get_action(mirror_action); if(act_tmp == NULL) { @@ -116,7 +116,7 @@ } } else { // Load images std::vector<std::string> images; - if(!lispreader.read_string_vector("images", images)) { + if(!lisp->get_vector("images", images)) { std::stringstream msg; msg << "Sprite '" << name << "' contains no images in action '" << action->name << "'."; Index: sprite_data.h =================================================================== RCS file: /cvsroot/super-tux/supertux/lib/special/sprite_data.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- sprite_data.h 24 Nov 2004 14:10:23 -0000 1.2 +++ sprite_data.h 28 Nov 2004 14:56:48 -0000 1.3 @@ -24,7 +24,7 @@ #include <vector> #include <map> -#include "utils/lispreader.h" +#include "lisp/lisp.h" #include "video/surface.h" namespace SuperTux @@ -35,7 +35,7 @@ public: /** cur has to be a pointer to data in the form of ((x-offset 5) (y-offset 10) ...) */ - SpriteData(lisp_object_t* cur); + SpriteData(const lisp::Lisp* cur); ~SpriteData(); const std::string& get_name() const @@ -72,7 +72,7 @@ typedef std::map <std::string, Action*> Actions; Actions actions; - void parse_action(LispReader& lispreader); + void parse_action(const lisp::Lisp* lispreader); /** Get an action */ Action* get_action(std::string act); Index: sprite_manager.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/lib/special/sprite_manager.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- sprite_manager.cpp 20 Nov 2004 22:14:36 -0000 1.5 +++ sprite_manager.cpp 28 Nov 2004 14:56:48 -0000 1.6 @@ -22,10 +22,12 @@ #include <sstream> #include <stdexcept> -#include "utils/lispreader.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" namespace SuperTux { @@ -45,42 +47,39 @@ 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; - - if (strcmp(lisp_symbol(lisp_car(cur)), "supertux-resources") != 0) - return; - cur = lisp_cdr(cur); + lisp::Parser parser; + try { + std::auto_ptr<lisp::Lisp> root (parser.parse(filename)); - while(cur) { - lisp_object_t* el = lisp_car(cur); + const lisp::Lisp* resources = root->get_lisp("supertux-resources"); + if(!resources) + throw std::runtime_error("file is not a supertux-resources files"); - if (strcmp(lisp_symbol(lisp_car(el)), "sprite") == 0) { - SpriteData* spritedata = new SpriteData(lisp_cdr(el)); + lisp::ListIterator iter(resources); + while(iter.next()) { + if(iter.item() == "sprite") { + SpriteData* spritedata = new SpriteData(iter.lisp()); - Sprites::iterator i = sprites.find(spritedata->get_name()); - if (i == sprites.end()) { - sprites[spritedata->get_name()] = spritedata; + printf("Spr: %s.\n", spritedata->get_name().c_str()); + 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; + } } else { - delete i->second; - i->second = spritedata; - std::cout << "Warning: dulpicate entry: '" << spritedata->get_name() - << "' in spritefile." << std::endl; + std::cout << "SpriteManager: Unknown tag '" << iter.item() + << "' in spritefile.\n"; } - } else { - std::cout << "SpriteManager: Unknown tag in spritefile.\n"; } - - cur = lisp_cdr(cur); + } catch(std::exception& e) { + std::stringstream msg; + msg << "Couldn't load file '" << filename << "': " << e.what() << "\n"; + throw std::runtime_error(msg.str()); } - - lisp_free(root_obj); } Sprite* Index: sprite.h =================================================================== RCS file: /cvsroot/super-tux/supertux/lib/special/sprite.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- sprite.h 24 Nov 2004 23:10:02 -0000 1.19 +++ sprite.h 28 Nov 2004 14:56:48 -0000 1.20 @@ -25,7 +25,6 @@ #include <cassert> #include <map> -#include "utils/lispreader.h" #include "video/surface.h" #include "math/vector.h" #include "sprite_data.h" |