X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=53edbf4abd6f1e3c68e18f07601d757f9689e84f;hb=20f975e6fefc179e110cff27d424ec231b8d3801;hp=01c4ea6744b4976149651f6fcf9685ce287c3863;hpb=ccab1476a8c4dba578db46dfb33f1a897c310d11;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 01c4ea674..53edbf4ab 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -28,6 +28,7 @@ #include "app/globals.h" #include "sector.h" +#include "player_status.h" #include "object/gameobjs.h" #include "object/camera.h" #include "object/background.h" @@ -56,6 +57,8 @@ #include "badguy/spike.h" #include "trigger/sequence_trigger.h" +//#define USE_GRID + Sector* Sector::_current = 0; Sector::Sector() @@ -100,6 +103,10 @@ Sector::parse_object(const std::string& name, const lisp::Lisp& reader) SnowParticleSystem* partsys = new SnowParticleSystem(); partsys->parse(reader); return partsys; + } else if(name == "particles-rain") { + RainParticleSystem* partsys = new RainParticleSystem(); + partsys->parse(reader); + return partsys; } else if(name == "particles-clouds") { CloudParticleSystem* partsys = new CloudParticleSystem(); partsys->parse(reader); @@ -206,6 +213,8 @@ Sector::parse_old_format(const lisp::Lisp& reader) add_object(new CloudParticleSystem()); else if(particlesystem == "snow") add_object(new SnowParticleSystem()); + else if(particlesystem == "rain") + add_object(new RainParticleSystem()); Vector startpos(100, 170); reader.get("start_pos_x", startpos.x); @@ -323,7 +332,8 @@ Sector::fix_old_tiles() add_object(new Brick(pos, tile->getData())); solids->change(x, y, 0); } else if(tile->getAttributes() & Tile::GOAL) { - add_object(new SequenceTrigger(pos, "endsequence")); + std::string sequence = tile->getData() == 0 ? "endsequence" : "stoptux"; + add_object(new SequenceTrigger(pos, sequence)); solids->change(x, y, 0); } } @@ -382,11 +392,33 @@ Sector::add_object(GameObject* object) void Sector::activate(const std::string& spawnpoint) { + SpawnPoint* sp = 0; + for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); + ++i) { + if((*i)->name == spawnpoint) { + sp = *i; + break; + } + } + if(!sp) { + std::cerr << "Spawnpoint '" << spawnpoint << "' not found.\n"; + if(spawnpoint != "main") { + activate("main"); + } else { + activate(Vector(0, 0)); + } + } else { + activate(sp->pos); + } +} + +void +Sector::activate(const Vector& player_pos) +{ _current = this; // Apply bonuses from former levels - switch (player_status.bonus) - { + switch (player_status.bonus) { case PlayerStatus::NO_BONUS: break; @@ -397,41 +429,16 @@ Sector::activate(const std::string& spawnpoint) case PlayerStatus::GROWUP_BONUS: player->grow(false); break; - } - SpawnPoint* sp = 0; - for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); - ++i) { - if((*i)->name == spawnpoint) { - sp = *i; + default: + std::cerr << "Unknown bonus in PlayerStatus?!?\n"; break; - } - } - if(!sp) { - std::cerr << "Spawnpoint '" << spawnpoint << "' not found.\n"; - } else { - player->move(sp->pos); } + player->move(player_pos); camera->reset(player->get_pos()); } -Vector -Sector::get_best_spawn_point(Vector pos) -{ - Vector best_reset_point = Vector(-1,-1); - - for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); - ++i) { - if((*i)->name != "main") - continue; - if((*i)->pos.x > best_reset_point.x && (*i)->pos.x < pos.x) - best_reset_point = (*i)->pos; - } - - return best_reset_point; -} - Rectangle Sector::get_active_region() { @@ -688,7 +695,7 @@ Sector::collision_object(MovingObject* object1, MovingObject* object2) void Sector::collision_handler() { -#if 0 +#ifdef USE_GRID grid->check_collisions(); #else for(std::vector::iterator i = gameobjects.begin(); @@ -732,6 +739,10 @@ Sector::collision_handler() bool Sector::add_bullet(const Vector& pos, float xm, Direction dir) { + // TODO remove this function and move these checks elsewhere... + static const size_t MAX_FIRE_BULLETS = 2; + static const size_t MAX_ICE_BULLETS = 1; + if(player->got_power == Player::FIRE_POWER) { if(bullets.size() > MAX_FIRE_BULLETS-1) return false; @@ -804,9 +815,6 @@ Sector::play_music(int type) case HERRING_MUSIC: SoundManager::get()->play_music(herring_song); break; - case CREDITS_MUSIC: - SoundManager::get()->play_music(credits_song); - break; default: SoundManager::get()->halt_music(); break; @@ -823,14 +831,13 @@ int Sector::get_total_badguys() { int total_badguys = 0; -#if 0 - for(GameObjects::iterator i = gameobjects_new.begin(); i != gameobjects_new.end(); ++i) - { + for(GameObjects::iterator i = gameobjects.begin(); + i != gameobjects.end(); ++i) { BadGuy* badguy = dynamic_cast (*i); if(badguy) total_badguys++; - } -#endif + } + return total_badguys; }