X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite_data.cpp;h=252fbf8fff4f8323d7de258fd56f930c92e1382b;hb=40e6e7cdc59c09befbd2595aea0c6e10428315d4;hp=6289076fe934f3b2d90b57e70a4550541d009d9e;hpb=d24699722cde9ae87fc95220c99f230928e72eee;p=supertux.git diff --git a/lib/special/sprite_data.cpp b/lib/special/sprite_data.cpp index 6289076fe..252fbf8ff 100644 --- a/lib/special/sprite_data.cpp +++ b/lib/special/sprite_data.cpp @@ -23,10 +23,11 @@ #include #include -#include "../app/globals.h" -#include "../app/setup.h" -#include "../special/sprite.h" -#include "../video/drawing_context.h" +#include "sprite_data.h" +#include "app/globals.h" +#include "app/setup.h" +#include "video/drawing_context.h" +#include "lisp/list_iterator.h" namespace SuperTux { @@ -46,21 +47,18 @@ SpriteData::Action::~Action() 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 @@ SpriteData::~SpriteData() } 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 mask_color; lispreader.read_int_vector("apply-mask", mask_color); if(mask_color.size() == 4) { @@ -97,9 +96,10 @@ SpriteData::parse_action(LispReader& lispreader) (*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 @@ SpriteData::parse_action(LispReader& lispreader) } } else { // Load images std::vector 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 << "'.";