fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / object / rock.cpp
index 467377c..f0b6c2c 100644 (file)
 
 #include "rock.hpp"
 #include "lisp/writer.hpp"
-#include "video/drawing_context.hpp"
-#include "resources.hpp"
 #include "object_factory.hpp"
+#include "audio/sound_manager.hpp"
+
+namespace {
+  const std::string ROCK_SOUND = "sounds/brick.wav"; //TODO use own sound.
+}
 
 Rock::Rock(const lisp::Lisp& reader)
        : MovingSprite(reader, "images/objects/rock/rock.sprite")
 {
+  sound_manager->preload( ROCK_SOUND );
   on_ground = false;
+  grabbed = false;
   flags |= FLAG_SOLID | FLAG_PORTABLE;
 }
 
@@ -46,17 +51,25 @@ Rock::write(lisp::Writer& writer)
 void
 Rock::update(float elapsed_time)
 {
-  if( !on_ground ) {
-    movement = physic.get_movement(elapsed_time);
-  }
+  if( grabbed )
+    return;
+
+  movement = physic.get_movement(elapsed_time);
 }
 
 void
 Rock::collision_solid(const CollisionHit& hit)
 {
-  physic.set_velocity(0, 0);
-  if( hit.bottom ){
-     on_ground = true;
+  if( hit.top || hit.bottom )
+    physic.set_velocity_y( 0 );
+  if( hit.left || hit.right )
+    physic.set_velocity_x( 0 );
+  if( hit.crush )
+    physic.set_velocity(0, 0);
+
+  if( hit.bottom  && !on_ground ){
+    sound_manager->play( ROCK_SOUND, get_pos() );
+    on_ground = true;
   }
 }
 
@@ -66,16 +79,16 @@ Rock::collision(GameObject& other, const CollisionHit& hit)
   if( !on_ground ){
       return FORCE_MOVE;
   }
-  
-  //Fake being solid for moving_object. 
+
+  //Fake being solid for moving_object.
   MovingObject* moving_object = dynamic_cast<MovingObject*> (&other);
   if( moving_object ){
       if( hit.top ){
         float inside = moving_object->get_bbox().get_bottom() - get_bbox().get_top();
         if( inside > 0 ){
           Vector pos = moving_object->get_pos();
-          pos.y -= inside; 
-          moving_object->set_pos( pos );    
+          pos.y -= inside;
+          moving_object->set_pos( pos );
         }
       }
       CollisionHit hit_other = hit;
@@ -92,7 +105,8 @@ Rock::grab(MovingObject& , const Vector& pos, Direction)
   movement = pos - get_pos();
   set_group( COLGROUP_DISABLED );
   on_ground = true;
+  grabbed = true;
+
 }
 
 void
@@ -100,7 +114,7 @@ Rock::ungrab(MovingObject& , Direction ){
   set_group( COLGROUP_MOVING );
   on_ground = false;
   physic.set_velocity(0, 0);
+  grabbed = false;
 }
 
 IMPLEMENT_FACTORY(Rock, "rock");
-