X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=4972ecc0d1d41af77b430d725822a5709d1cf557;hb=576d79481d0cec9dd441b9b235a01da63584d137;hp=b9b959abdbd635d7f70bfab9b80f4003184fc665;hpb=e93847fc4f12fe9eb1bcc7490be014e0ed13f29e;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index b9b959abd..4972ecc0d 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -16,15 +16,17 @@ // 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 "sector.h" #include +#include #include #include #include #include -#include "lispreader.h" +#include "globals.h" +#include "sector.h" +#include "lispreader.h" #include "badguy.h" #include "special.h" #include "gameobjs.h" @@ -72,13 +74,14 @@ Sector::parse(LispReader& lispreader) for(lisp_object_t* cur = lispreader.get_lisp(); !lisp_nil_p(cur); cur = lisp_cdr(cur)) { std::string token = lisp_symbol(lisp_car(lisp_car(cur))); + // FIXME: doesn't handle empty data 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 == "gravity") { - gravity = lisp_integer(data); + gravity = lisp_real(data); } else if(token == "music") { song_title = lisp_string(data); load_music(); @@ -262,7 +265,20 @@ Sector::write(LispWriter& writer) { writer.write_string("name", name); writer.write_float("gravity", gravity); + writer.write_string("music", song_title); + + // write spawnpoints + for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); + ++i) { + SpawnPoint* spawn = *i; + writer.start_list("playerspawn"); + writer.write_string("name", spawn->name); + writer.write_float("x", spawn->pos.x); + writer.write_float("y", spawn->pos.y); + writer.end_list("playerspawn"); + } + // write objects for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { Serializable* serializable = dynamic_cast (*i); @@ -272,30 +288,41 @@ Sector::write(LispWriter& writer) } void +Sector::do_vertical_flip() +{ + for(GameObjects::iterator i = gameobjects_new.begin(); i != gameobjects_new.end(); ++i) + { + TileMap* tilemap = dynamic_cast (*i); + if(tilemap) + { + tilemap->do_vertical_flip(); + } + + BadGuy* badguy = dynamic_cast (*i); + if(badguy) + badguy->start_position.y = solids->get_height()*32 - badguy->start_position.y - 32; + Trampoline* trampoline = dynamic_cast (*i); + if(trampoline) + trampoline->base.y = solids->get_height()*32 - trampoline->base.y - 32; + FlyingPlatform* flying_platform = dynamic_cast (*i); + if(flying_platform) + flying_platform->base.y = solids->get_height()*32 - flying_platform->base.y - 32; + Door* door = dynamic_cast (*i); + if(door) + door->set_area(door->get_area().x, solids->get_height()*32 - door->get_area().y - 32); + } + + for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); + ++i) { + SpawnPoint* spawn = *i; + spawn->pos.y = solids->get_height()*32 - spawn->pos.y - 32; + } +} + +void Sector::add_object(GameObject* object) { - // XXX a bit hackish, at least try to keep the number of these things down... - BadGuy* badguy = dynamic_cast (object); - if(badguy) - badguys.push_back(badguy); - Bullet* bullet = dynamic_cast (object); - if(bullet) - bullets.push_back(bullet); - Upgrade* upgrade = dynamic_cast (object); - if(upgrade) - upgrades.push_back(upgrade); - Trampoline* trampoline = dynamic_cast (object); - if(trampoline) - trampolines.push_back(trampoline); - FlyingPlatform* flying_platform = dynamic_cast (object); - if(flying_platform) - flying_platforms.push_back(flying_platform); - InteractiveObject* interactive_object - = dynamic_cast (object); - if(interactive_object) - interactive_objects.push_back(interactive_object); - - gameobjects.push_back(object); + gameobjects_new.push_back(object); } void @@ -350,6 +377,12 @@ Sector::action(float elapsed_time) /* Handle all possible collisions. */ collision_handler(); + update_game_objects(); +} + +void +Sector::update_game_objects() +{ /** cleanup marked objects */ for(std::vector::iterator i = gameobjects.begin(); i != gameobjects.end(); /* nothing */) { @@ -397,6 +430,34 @@ Sector::action(float elapsed_time) ++i; } } + + /* add newly created objects */ + for(std::vector::iterator i = gameobjects_new.begin(); + i != gameobjects_new.end(); ++i) + { + BadGuy* badguy = dynamic_cast (*i); + if(badguy) + badguys.push_back(badguy); + Bullet* bullet = dynamic_cast (*i); + if(bullet) + bullets.push_back(bullet); + Upgrade* upgrade = dynamic_cast (*i); + if(upgrade) + upgrades.push_back(upgrade); + Trampoline* trampoline = dynamic_cast (*i); + if(trampoline) + trampolines.push_back(trampoline); + FlyingPlatform* flying_platform = dynamic_cast (*i); + if(flying_platform) + flying_platforms.push_back(flying_platform); + InteractiveObject* interactive_object + = dynamic_cast (*i); + if(interactive_object) + interactive_objects.push_back(interactive_object); + + gameobjects.push_back(*i); + } + gameobjects_new.clear(); } void @@ -752,7 +813,7 @@ Sector::trygrabdistro(const Vector& pos, int bounciness) throw SuperTuxException(errmsg, __FILE__, __LINE__); */ //Bad tiles (i.e. tiles that are not defined in supertux.stgt but appear in the map) are changed to ID 0 (blank tile) - std::cout << "Warning: Undefined tile at " <<(int)pos.x/32 << "/" << (int)pos.y/32 << " (ID: " << (int)solids->get_tile_id_at(pos) << ")" << std::endl; + std::cout << "Warning: Undefined tile at " <<(int)pos.x/32 << "/" << (int)pos.y/32 << " (ID: " << (int)solids->get_tile_id_at(pos).id << ")" << std::endl; solids->change_at(pos,0); tile = solids->get_tile_at(pos); }