X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fsector.cpp;h=ba097a00200bb519fea7fc1deff657abc12f31ee;hb=1e30ee2923145eeda5aa36417adc2928b347d8f0;hp=ebf1344114f90bad6cfab421be1b300bf9546605;hpb=c2cdad4bfdf83a0066753b1162e3b7fd9dd63c93;p=supertux.git diff --git a/src/supertux/sector.cpp b/src/supertux/sector.cpp index ebf134411..ba097a002 100644 --- a/src/supertux/sector.cpp +++ b/src/supertux/sector.cpp @@ -77,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(), @@ -109,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; @@ -227,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) { @@ -237,6 +243,7 @@ Sector::parse(const Reader& sector) } update_game_objects(); + foremost_layer = calculate_foremost_layer(); } void @@ -392,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(); @@ -419,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") ); @@ -585,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); @@ -656,28 +666,24 @@ Sector::get_active_region() int Sector::calculate_foremost_layer() { - int layer = 0; - std::vector secret_area_layers; - for(auto i = gameobjects.begin(); i != gameobjects.end(); ++i) - { - SecretAreaTrigger* trigger = dynamic_cast(i->get()); - if (!trigger) continue; - secret_area_layers.push_back(trigger->get_fade_tilemap_name()); - } - + 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) { - if (std::find(secret_area_layers.begin(), secret_area_layers.end(), tm->get_name()) - != secret_area_layers.end() || tm->is_solid()) + if( (tm->get_alpha() < 1.0) ) { - layer = tm->get_layer(); + layer = tm->get_layer() - 1; + } + else + { + layer = tm->get_layer() + 1; } } } + log_debug << "Calculated baduy falling layer was: " << layer << std::endl; return layer; } @@ -1465,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)); @@ -1508,6 +1497,20 @@ Sector::play_music(MusicType type) } } +void +Sector::resume_music() +{ + if(SoundManager::current()->get_current_music() == music) + { + SoundManager::current()->resume_music(3.2f); + } + else + { + SoundManager::current()->stop_music(); + SoundManager::current()->play_music(music, true); + } +} + MusicType Sector::get_music_type() {