Fix for coverity #29394
[supertux.git] / src / badguy / mrbomb.cpp
index 67efd64..b3b4a9e 100644 (file)
@@ -18,6 +18,7 @@
 #include "badguy/bomb.hpp"
 #include "badguy/mrbomb.hpp"
 #include "object/explosion.hpp"
+#include "object/player.hpp"
 #include "sprite/sprite.hpp"
 #include "sprite/sprite_manager.hpp"
 #include "supertux/object_factory.hpp"
@@ -33,7 +34,7 @@ MrBomb::MrBomb(const Reader& reader) :
   grabbed = false;
 
   //Prevent stutter when Tux jumps on Mr Bomb
-  sound_manager->preload("sounds/explosion.wav");
+  SoundManager::current()->preload("sounds/explosion.wav");
 
   //Check if we need another sprite
   if( !reader.get( "sprite", sprite_name ) ){
@@ -44,7 +45,7 @@ MrBomb::MrBomb(const Reader& reader) :
     return;
   }
   //Replace sprite
-  sprite = sprite_manager->create( sprite_name );
+  sprite = SpriteManager::current()->create( sprite_name );
 }
 
 /* MrBomb created by a dispenser always gets default sprite atm.*/
@@ -55,7 +56,7 @@ MrBomb::MrBomb(const Vector& pos, Direction d) :
   walk_speed = 80;
   max_drop_height = 16;
   grabbed = false;
-  sound_manager->preload("sounds/explosion.wav");
+  SoundManager::current()->preload("sounds/explosion.wav");
 }
 
 HitResponse
@@ -77,9 +78,15 @@ MrBomb::collision_player(Player& player, const CollisionHit& hit)
 bool
 MrBomb::collision_squished(GameObject& object)
 {
+  Player* player = dynamic_cast<Player*>(&object);
+  if(player && player->is_invincible()) {
+    player->bounce(*this);
+    kill_fall();
+    return true;
+  }
   if(is_valid()) {
     remove_me();
-    Sector::current()->add_object(new Bomb(get_pos(), dir, sprite_name ));
+    Sector::current()->add_object(std::make_shared<Bomb>(get_pos(), dir, sprite_name));
   }
   kill_squished(object);
   return true;
@@ -98,7 +105,7 @@ MrBomb::kill_fall()
 {
   if(is_valid()) {
     remove_me();
-    Explosion* explosion = new Explosion(get_bbox().get_middle());
+    auto explosion = std::make_shared<Explosion>(get_bbox().get_middle());
     Sector::current()->add_object(explosion);
   }
 
@@ -106,31 +113,24 @@ MrBomb::kill_fall()
 }
 
 void
-MrBomb::grab(MovingObject&, const Vector& pos, Direction dir)
+MrBomb::grab(MovingObject&, const Vector& pos, Direction dir_)
 {
   assert(frozen);
   movement = pos - get_pos();
-  this->dir = dir;
-  sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
+  this->dir = dir_;
+  sprite->set_action(dir_ == LEFT ? "iced-left" : "iced-right");
   set_colgroup_active(COLGROUP_DISABLED);
   grabbed = true;
 }
 
 void
-MrBomb::ungrab(MovingObject& , Direction dir)
+MrBomb::ungrab(MovingObject& , Direction dir_)
 {
-  this->dir = dir;
+  this->dir = dir_;
   set_colgroup_active(COLGROUP_MOVING);
   grabbed = false;
 }
 
-void
-MrBomb::freeze()
-{
-  WalkingBadguy::freeze();
-  sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
-}
-
 bool
 MrBomb::is_freezable() const
 {
@@ -143,6 +143,4 @@ MrBomb::is_portable() const
   return frozen;
 }
 
-IMPLEMENT_FACTORY(MrBomb, "mrbomb");
-
 /* EOF */