X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=00a853876f0b90ab441a9776703111d63d1838af;hb=eb23a0fa28b9562a120145f5aef1cb391ec1e410;hp=4037f35fb9e2224f9a0a71d636f877d533459e05;hpb=9599042661b468aae7bd34dca05441c0ebc93ad7;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 4037f35fb..00a853876 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -56,6 +56,7 @@ #include "badguy/jumpy.h" #include "badguy/spike.h" #include "trigger/sequence_trigger.h" +#include "player_status.h" //#define USE_GRID @@ -66,7 +67,7 @@ Sector::Sector() currentmusic(LEVEL_MUSIC) { song_title = "Mortimers_chipdisko.mod"; - player = new Player(); + player = new Player(&player_status); add_object(player); grid = new CollisionGrid(32000, 32000); @@ -157,14 +158,15 @@ Sector::parse(const lisp::Lisp& sector) update_game_objects(); fix_old_tiles(); - update_game_objects(); if(!camera) { std::cerr << "sector '" << name << "' does not contain a camera.\n"; - camera = new Camera(this); - add_object(camera); + update_game_objects(); + add_object(new Camera(this)); } if(!solids) throw std::runtime_error("sector does not contain a solid tile layer."); + + update_game_objects(); } void @@ -332,7 +334,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); } } @@ -391,23 +394,6 @@ Sector::add_object(GameObject* object) void Sector::activate(const std::string& spawnpoint) { - _current = this; - - // Apply bonuses from former levels - switch (player_status.bonus) - { - case PlayerStatus::NO_BONUS: - break; - - case PlayerStatus::FLOWER_BONUS: - player->got_power = Player::FIRE_POWER; // FIXME: add ice power to here - // fall through - - case PlayerStatus::GROWUP_BONUS: - player->grow(false); - break; - } - SpawnPoint* sp = 0; for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); ++i) { @@ -415,30 +401,26 @@ Sector::activate(const std::string& spawnpoint) sp = *i; break; } - } + } if(!sp) { std::cerr << "Spawnpoint '" << spawnpoint << "' not found.\n"; + if(spawnpoint != "main") { + activate("main"); + } else { + activate(Vector(0, 0)); + } } else { - player->move(sp->pos); + activate(sp->pos); } - - camera->reset(player->get_pos()); } -Vector -Sector::get_best_spawn_point(Vector pos) +void +Sector::activate(const Vector& player_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; - } + _current = this; - return best_reset_point; + player->move(player_pos); + camera->reset(player->get_pos()); } Rectangle @@ -744,22 +726,19 @@ 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) { + + Bullet* new_bullet = 0; + if(player_status.bonus == FIRE_BONUS) { if(bullets.size() > MAX_FIRE_BULLETS-1) return false; - } else if(player->got_power == Player::ICE_POWER) { + new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET); + } else if(player_status.bonus == ICE_BONUS) { if(bullets.size() > MAX_ICE_BULLETS-1) return false; - } - - Bullet* new_bullet = 0; - if(player->got_power == Player::FIRE_POWER) - new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET); - else if(player->got_power == Player::ICE_POWER) new_bullet = new Bullet(pos, xm, dir, ICE_BULLET); - else - throw std::runtime_error("wrong bullet type."); + } else { + return false; + } add_object(new_bullet); SoundManager::get()->play_sound(IDToSound(SND_SHOOT));