From: Ricardo Cruz Date: Mon, 17 May 2004 09:11:58 +0000 (+0000) Subject: Added a skelaton for the config bad guys code. Just a rip from the Ingo's tiles code. X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=f692c6b01f3e9dbcef4cb7d148b9e13d0531d81d;p=supertux.git Added a skelaton for the config bad guys code. Just a rip from the Ingo's tiles code. SVN-Revision: 1232 --- diff --git a/src/badguy.cpp b/src/badguy.cpp index 7b8db66c9..6497e7e03 100644 --- a/src/badguy.cpp +++ b/src/badguy.cpp @@ -1196,4 +1196,136 @@ void free_badguy_gfx() { } +//--------------------------------------------------------------------------- + +BadGuyManager::BadGuyManager() +{ + std::string filename = datadir + "/images/tilesets/supertux.stbg"; + load_badguys(filename); +} + +BadGuyManager::~BadGuyManager() +{ + for(std::vector::iterator i = badguys.begin(); i != badguys.end(); ++i) { + delete *i; + } +} + +void BadGuyManager::load_badguys(std::string filename) +{ +/* + lisp_object_t* root_obj = lisp_read_from_file(filename); + + if (!root_obj) + st_abort("Couldn't load file", filename); + + if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-badguys") == 0) + { + lisp_object_t* cur = lisp_cdr(root_obj); + + while(!lisp_nil_p(cur)) + { + lisp_object_t* element = lisp_car(cur); + + if (strcmp(lisp_symbol(lisp_car(element)), "badguy") == 0) + { + + + Tile* tile = new Tile; + tile->id = -1; + tile->solid = false; + tile->brick = false; + tile->ice = false; + tile->water = false; + tile->fullbox = false; + tile->distro = false; + tile->goal = false; + tile->data = 0; + tile->next_tile = 0; + tile->anim_speed = 25; + + LispReader reader(lisp_cdr(element)); + assert(reader.read_int("id", &tile->id)); + reader.read_bool("solid", &tile->solid); + reader.read_bool("brick", &tile->brick); + reader.read_bool("ice", &tile->ice); + reader.read_bool("water", &tile->water); + reader.read_bool("fullbox", &tile->fullbox); + reader.read_bool("distro", &tile->distro); + reader.read_bool("goal", &tile->goal); + reader.read_int("data", &tile->data); + reader.read_int("anim-speed", &tile->anim_speed); + reader.read_int("next-tile", &tile->next_tile); + reader.read_string_vector("images", &tile->filenames); + reader.read_string_vector("editor-images", &tile->editor_filenames); + + for(std::vector::iterator it = tile-> + filenames.begin(); + it != tile->filenames.end(); + ++it) + { + Surface* cur_image; + tile->images.push_back(cur_image); + tile->images[tile->images.size()-1] = new Surface( + datadir + "/images/tilesets/" + (*it), + USE_ALPHA); + } + for(std::vector::iterator it = tile->editor_filenames.begin(); + it != tile->editor_filenames.end(); + ++it) + { + Surface* cur_image; + tile->editor_images.push_back(cur_image); + tile->editor_images[tile->editor_images.size()-1] = new Surface( + datadir + "/images/tilesets/" + (*it), + USE_ALPHA); + } + + if (tile->id + tileset_id >= int(tiles.size()) + ) + tiles.resize(tile->id + tileset_id+1); + + tiles[tile->id + tileset_id] = tile; + } + else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0) + { + LispReader reader(lisp_cdr(element)); + std::string filename; + reader.read_string("file", &filename); + filename = datadir + "/images/tilesets/" + filename; + load_tileset(filename); + } + else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0) + { + TileGroup new_; + LispReader reader(lisp_cdr(element)); + reader.read_string("name", &new_.name); + reader.read_int_vector("tiles", &new_.tiles); + if(!tilegroups_) + tilegroups_ = new std::set; + tilegroups_->insert(new_).first; + } + else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0) + { + LispReader reader(lisp_cdr(element)); + reader.read_int("id", &tileset_id); + tileset_id *= 1000; + } + else + { + puts("Unhandled symbol"); + } + + cur = lisp_cdr(cur); + } + } + else + { + assert(0); + } + + lisp_free(root_obj); +*/ +} + // EOF // diff --git a/src/badguy.h b/src/badguy.h index 0335351be..1eb2862c9 100644 --- a/src/badguy.h +++ b/src/badguy.h @@ -179,6 +179,36 @@ struct BadGuyData : kind(BAD_SNOWBALL), x(0), y(0), stay_on_platform(false) {} }; +class BadGuyManager +{ + private: + BadGuyManager(); + ~BadGuyManager(); + + std::vector badguys; + static BadGuyManager* instance_ ; + + void load_badguys(std::string filename); + + public: + static BadGuyManager* instance() { return instance_ ? instance_ : instance_ = new BadGuyManager(); } + static void destroy_instance() { delete instance_; instance_ = 0; } + + BadGuy* get(unsigned int id) { + if(id < badguys.size()) + { + return badguys[id]; + } + else + { + // Never return 0, but return the 0th tile instead so that + // user code doesn't have to check for NULL pointers all over + // the place + return badguys[0]; + } + } +}; + #endif /*SUPERTUX_BADGUY_H*/ /* Local Variables: */