Fix coverity #29604
[supertux.git] / src / supertux / sector.cpp
index 409ec87..c9879c9 100644 (file)
@@ -110,15 +110,20 @@ Sector::Sector(Level* parent) :
     throw scripting::SquirrelError(global_vm, "Couldn't get sector table");
   sq_addref(global_vm, &sector_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;
@@ -238,6 +243,7 @@ Sector::parse(const Reader& sector)
   }
 
   update_game_objects();
+  foremost_layer = calculate_foremost_layer();
 }
 
 void
@@ -588,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);
@@ -659,28 +666,24 @@ Sector::get_active_region()
 int
 Sector::calculate_foremost_layer()
 {
-  int layer = 0;
-  std::vector<std::string> secret_area_tilemaps;
-  for(auto i = gameobjects.begin(); i != gameobjects.end(); ++i)
-  {
-    SecretAreaTrigger* trigger = dynamic_cast<SecretAreaTrigger*>(i->get());
-    if (!trigger) continue;
-    secret_area_tilemaps.push_back(trigger->get_fade_tilemap_name());
-  }
-
+  int layer = LAYER_BACKGROUND0;
   for(auto i = gameobjects.begin(); i != gameobjects.end(); ++i)
   {
     TileMap* tm = dynamic_cast<TileMap*>(i->get());
     if (!tm) continue;
-    if(tm->get_layer() > foremost_layer)
+    if(tm->get_layer() > layer)
     {
-      if (std::find(secret_area_tilemaps.begin(), secret_area_tilemaps.end(), tm->get_name())
-            != secret_area_tilemaps.end() || tm->is_solid())
+      if( (tm->get_alpha() < 1.0) )
+      {
+        layer = tm->get_layer() - 1;
+      }
+      else
       {
-        layer = tm->get_layer();
+        layer = tm->get_layer() + 1;
       }
     }
   }
+  log_debug << "Calculated baduy falling layer was: " << layer << std::endl;
   return layer;
 }