X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fsector.cpp;h=351fe3123d3f072154fbe0f332d8456f74349b7e;hb=589f20b4fb9f3b0698ab70a748ea3b8fb129e39d;hp=efc5ff82fd208d26f4c208dd04267aba15b8933e;hpb=07d70c5970749990ee8c7c0fa7a7e3f3de02b9c9;p=supertux.git diff --git a/src/supertux/sector.cpp b/src/supertux/sector.cpp index efc5ff82f..351fe3123 100644 --- a/src/supertux/sector.cpp +++ b/src/supertux/sector.cpp @@ -58,6 +58,7 @@ #include "supertux/savegame.hpp" #include "supertux/spawn_point.hpp" #include "supertux/tile.hpp" +#include "trigger/secretarea_trigger.hpp" #include "trigger/sequence_trigger.hpp" #include "util/file_system.hpp" @@ -76,6 +77,7 @@ Sector::Sector(Level* parent) : sector_table(), scripts(), ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), + foremost_layer(), gameobjects(), moving_objects(), spawnpoints(), @@ -108,15 +110,20 @@ Sector::Sector(Level* parent) : throw scripting::SquirrelError(global_vm, "Couldn't get sector table"); sq_addref(global_vm, §or_table); sq_pop(global_vm, 1); - - foremost_layer = calculate_foremost_layer(); } Sector::~Sector() { using namespace scripting; + try + { + deactivate(); + } + catch(const std::exception& err) + { + log_warning << err.what() << std::endl; + } - deactivate(); for(auto i = scripts.begin(); i != scripts.end(); ++i) { HSQOBJECT& object = *i; @@ -226,7 +233,7 @@ Sector::parse(const Reader& sector) update_game_objects(); - if(solid_tilemaps.size() < 1) { log_warning << "sector '" << name << "' does not contain a solid tile layer." << std::endl; } + if(solid_tilemaps.empty()) { log_warning << "sector '" << name << "' does not contain a solid tile layer." << std::endl; } fix_old_tiles(); if(!camera) { @@ -236,6 +243,7 @@ Sector::parse(const Reader& sector) } update_game_objects(); + foremost_layer = calculate_foremost_layer(); } void @@ -391,7 +399,7 @@ Sector::parse_old_format(const Reader& reader) update_game_objects(); - if(solid_tilemaps.size() < 1) { log_warning << "sector '" << name << "' does not contain a solid tile layer." << std::endl; } + if(solid_tilemaps.empty()) { log_warning << "sector '" << name << "' does not contain a solid tile layer." << std::endl; } fix_old_tiles(); update_game_objects(); @@ -418,7 +426,9 @@ Sector::fix_old_tiles() add_object(std::make_shared(pos, tile->getData())); solids->change(x, y, 0); } else if(tile->getAttributes() & Tile::BRICK) { - if( ( id == 78 ) || ( id == 105 ) ){ + if( ( id == 3159 ) || ( id == 3160 ) ){ + add_object( std::make_shared(pos, tile->getData(), "images/objects/bonus_block/brickWeb.sprite") ); + } else if( ( id == 78 ) || ( id == 105 ) ){ add_object( std::make_shared(pos, tile->getData(), "images/objects/bonus_block/brickIce.sprite") ); } else if( ( id == 77 ) || ( id == 104 ) ){ add_object( std::make_shared(pos, tile->getData(), "images/objects/bonus_block/brick.sprite") ); @@ -584,7 +594,8 @@ Sector::activate(const Vector& player_pos) // spawning tux in the ground would kill him if(!is_free_of_tiles(p->get_bbox())) { - log_warning << "Tried spawning Tux in solid matter. Compensating." << std::endl; + std::string current_level = "[" + Sector::current()->get_level()->filename + "] "; + log_warning << current_level << "Tried spawning Tux in solid matter. Compensating." << std::endl; Vector npos = p->get_bbox().p1; npos.y-=32; p->move(npos); @@ -655,16 +666,24 @@ Sector::get_active_region() int Sector::calculate_foremost_layer() { - int layer = 0; + int layer = LAYER_BACKGROUND0; for(auto i = gameobjects.begin(); i != gameobjects.end(); ++i) { TileMap* tm = dynamic_cast(i->get()); if (!tm) continue; - if(tm->get_layer() > foremost_layer) + if(tm->get_layer() > layer) { - layer = tm->get_layer(); + if( (tm->get_alpha() < 1.0) ) + { + layer = tm->get_layer() - 1; + } + else + { + layer = tm->get_layer() + 1; + } } } + log_debug << "Calculated baduy falling layer was: " << layer << std::endl; return layer; } @@ -1452,23 +1471,6 @@ Sector::is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_o } bool -Sector::add_bullet(const Vector& pos, const PlayerStatus* player_status, float xm, Direction dir) -{ - // TODO remove this function and move these checks elsewhere... - if((player_status->bonus == FIRE_BONUS && - (int)bullets.size() >= player_status->max_fire_bullets) || - (player_status->bonus == ICE_BONUS && - (int)bullets.size() >= player_status->max_ice_bullets)) - return false; - auto new_bullet = std::make_shared(pos, xm, dir, player_status->bonus); - add_object(new_bullet); - - SoundManager::current()->play("sounds/shoot.wav"); - - return true; -} - -bool Sector::add_smoke_cloud(const Vector& pos) { add_object(std::make_shared(pos)); @@ -1495,6 +1497,19 @@ Sector::play_music(MusicType type) } } +void +Sector::resume_music() +{ + if(SoundManager::current()->get_current_music() == music) + { + SoundManager::current()->resume_music(1.5f); + } + else + { + SoundManager::current()->play_music(music, true); + } +} + MusicType Sector::get_music_type() {