Index: src/object/physical_obj.cpp
===================================================================
--- src/object/physical_obj.cpp	(révision 4305)
+++ src/object/physical_obj.cpp	(copie de travail)
@@ -235,6 +235,8 @@
 
 void PhysicalObj::SetEnergyDelta(int delta, bool /*do_report*/)
 {
+  MSG_DEBUG("physical.energy", "%s gets %d energy points", m_name.c_str(), delta);
+
   if (m_energy == -1)
     return;
   m_energy += delta;
@@ -311,8 +313,20 @@
     // Test if we collide...
     collided_obj = CollidedObjectXY(tmpPos);
     if (collided_obj != NULL) {
-      MSG_DEBUG( "physic.state", "%s collide on %s", m_name.c_str(), collided_obj->GetName().c_str() );
+      MSG_DEBUG( "physic.state", "%s (%d, %d) collides on %s (%d, %d)",
+		 m_name.c_str(), tmpPos.x, tmpPos.y,
+		 collided_obj->GetName().c_str(), collided_obj->GetX(), collided_obj->GetY() );
       collision = COLLISION_ON_OBJECT;
+
+      // If we were already colliding, the collision has been probably already handled by the other object...
+      PhysicalObj* collided_obj2 = NULL;
+      collided_obj2 = CollidedObjectXY(oldPos);
+      if (collided_obj2 == collided_obj) {
+	MSG_DEBUG( "physic.state", "Ignoring collision of %s collide with %s",
+		   m_name.c_str(), collided_obj->GetName().c_str());
+	collided_obj = NULL;
+	collision = NO_COLLISION;
+      }
     } else if (!IsInVacuumXY(tmpPos, false)) {
       collision = COLLISION_ON_GROUND;
     }
@@ -351,8 +365,15 @@
     ASSERT(!collided_obj);
     break;
   case COLLISION_ON_GROUND:
-    SignalGroundCollision(speed_before_collision);
-    SignalCollision(speed_before_collision);
+    // were we already on the ground at the beginning of the function ?
+    {
+      MSG_DEBUG( "physic.state", "%s - Do not signal collision on ground as we were already on it\n");
+      Point2i prevPos( lround(oldPos.x), lround(oldPos.y) );
+      if (!IsInVacuumXY(prevPos, false)) {
+	SignalGroundCollision(speed_before_collision);
+	SignalCollision(speed_before_collision);
+      }
+    }
     break;
   case COLLISION_ON_OBJECT:
     SignalObjectCollision(collided_obj, speed_before_collision);
@@ -408,7 +429,7 @@
   }
 
   // Make it rebound!!
-  MSG_DEBUG("physic.state", "m_name.c_str() rebounds at %d,%d", m_name.c_str(), contactPos.x, contactPos.y);
+  MSG_DEBUG("physic.state", "%s rebounds at %d,%d", m_name.c_str(), contactPos.x, contactPos.y);
 
   Rebound(contactPos, contactAngle);
   CheckRebound();
Index: src/object/physical_obj.h
===================================================================
--- src/object/physical_obj.h	(révision 4305)
+++ src/object/physical_obj.h	(copie de travail)
@@ -212,7 +212,7 @@
   virtual void SignalOutOfMap() { };
 
 private:
-  //Retrun the position of the point of contact of the obj on the ground
+  //Return the position of the point of contact of the obj on the ground
   bool ContactPoint (int &x, int &y) const;
 
 
