#303: Typo fixes from mathnerd314
[supertux.git] / src / object / block.cpp
index 68721e8..61bf7c3 100644 (file)
@@ -33,6 +33,7 @@
 #include "lisp/lisp.hpp"
 #include "gameobjs.hpp"
 #include "portable.hpp"
+#include "moving_object.hpp"
 #include "specialriser.hpp"
 #include "growup.hpp"
 #include "flower.hpp"
@@ -77,10 +78,13 @@ Block::collision(GameObject& other, const CollisionHit& )
 
   // only interact with other objects if...
   //   1) we are bouncing
-  // and
   //   2) the object is not portable (either never or not currently)
+  //   3) the object is being hit from below (baguys don't get killed for activating boxes)
   Portable* portable = dynamic_cast<Portable*> (&other);
-  if(bouncing && (portable == 0 || (!portable->is_portable()))) {
+  MovingObject* moving_object = dynamic_cast<MovingObject*> (&other);
+  bool is_portable = ((portable != 0) && portable->is_portable());
+  bool hit_mo_from_below = ((moving_object == 0) || (moving_object->get_bbox().get_bottom() < (get_bbox().get_top() + 7.0)));
+  if(bouncing && !is_portable && hit_mo_from_below) {
 
     // Badguys get killed
     BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
@@ -135,7 +139,7 @@ Block::draw(DrawingContext& context)
 }
 
 void
-Block::start_bounce(float center_of_hitter)
+Block::start_bounce(GameObject* hitter)
 {
   if(original_y == -1){
     original_y = bbox.p1.y;
@@ -144,14 +148,18 @@ Block::start_bounce(float center_of_hitter)
   bounce_dir = -BOUNCY_BRICK_SPEED;
   bounce_offset = 0;
 
-  float offset = (get_bbox().get_middle().x - center_of_hitter)*2 / get_bbox().get_width();
-  sprite->set_angle(BUMP_ROTATION_ANGLE*offset);
+  MovingObject* hitter_mo = dynamic_cast<MovingObject*>(hitter);
+  if (hitter_mo) {
+    float center_of_hitter = hitter_mo->get_bbox().get_middle().x;
+    float offset = (get_bbox().get_middle().x - center_of_hitter)*2 / get_bbox().get_width();
+    sprite->set_angle(BUMP_ROTATION_ANGLE*offset);
+  }
 }
 
 void
-Block::start_break(float center_of_hitter)
+Block::start_break(GameObject* hitter)
 {
-  start_bounce(center_of_hitter);
+  start_bounce(hitter);
   breaking = true;
 }
 
@@ -318,7 +326,7 @@ BonusBlock::try_open()
       break;
   }
 
-  start_bounce(player.get_bbox().get_middle().x);
+  start_bounce(&player);
   sprite->set_action("empty");
 }
 
@@ -406,14 +414,14 @@ Brick::try_break(Player* player)
     player_one.get_status()->add_coins(1);
     if(coin_counter == 0)
       sprite->set_action("empty");
-    start_bounce(player->get_bbox().get_middle().x);
+    start_bounce(player);
   } else if(breakable) {
     if(player){
       if(player->is_big()){
-        start_break(player->get_bbox().get_middle().x);
+        start_break(player);
         return;
       } else {
-        start_bounce(player->get_bbox().get_middle().x);
+        start_bounce(player);
         return;
       }
     }