play sound when willowisp is caught
[supertux.git] / src / object / player.cpp
index 5fa91de..31d38a9 100644 (file)
 #include "object/sprite_particle.hpp"
 #include "trigger/climbable.hpp"
 
+//#define SWIMMING
+
 static const int TILES_FOR_BUTTJUMP = 3;
 static const float SHOOTING_TIME = .150f;
 /// time before idle animation starts
 static const float IDLE_TIME = 2.5f;
 
+/** acceleration in horizontal direction when walking
+ * (all acceleratiosn are in  pixel/s^2) */
 static const float WALK_ACCELERATION_X = 300;
+/** acceleration in horizontal direction when running */ 
 static const float RUN_ACCELERATION_X = 400;
+/** acceleration when skidding */
 static const float SKID_XM = 200;
+/** time of skidding in seconds */
 static const float SKID_TIME = .3f;
+/** maximum walk velocity (pixel/s) */
 static const float MAX_WALK_XM = 230;
+/** maximum run velcoity (pixel/s) */
 static const float MAX_RUN_XM = 320;
+/** maximum horizontal climb velocity */
 static const float MAX_CLIMB_XM = 48;
+/** maximum vertical climb velocity */
 static const float MAX_CLIMB_YM = 128;
+/** instant velocity when tux starts to walk */
 static const float WALK_SPEED = 100;
 
+/** time of the kick (kicking mriceblock) animation */
 static const float KICK_TIME = .3f;
+/** time of tux cheering (currently unused) */
 static const float CHEER_TIME = 1.0f;
 
-static const float UNDUCK_HURT_TIME = 0.25f; /**< if Tux cannot unduck for this long, he will get hurt */
+/** if Tux cannot unduck for this long, he will get hurt */
+static const float UNDUCK_HURT_TIME = 0.25f;
 
 // growing animation
 Surface* growingtux_left[GROWING_FRAMES];
@@ -99,16 +114,16 @@ TuxBodyParts::set_action(std::string action, int loops)
 }
 
 void
-TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer)
+TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer, Portable* grabbed_object)
 {
   if(head != NULL)
-    head->draw(context, pos, layer-1);
+    head->draw(context, pos, layer-2);
   if(body != NULL)
-    body->draw(context, pos, layer-3);
+    body->draw(context, pos, layer-4);
   if(arms != NULL)
-    arms->draw(context, pos, layer+10);
+    arms->draw(context, pos, layer-1 + (grabbed_object?10:0));
   if(feet != NULL)
-    feet->draw(context, pos, layer-2);
+    feet->draw(context, pos, layer-3);
 }
 
 Player::Player(PlayerStatus* _player_status, const std::string& name)
@@ -588,11 +603,13 @@ Player::handle_vertical_input()
 
   // swimming
   physic.set_acceleration_y(0);
+#ifdef SWIMMING
   if (swimming) {
     if (controller->hold(Controller::UP) || controller->hold(Controller::JUMP))
       physic.set_acceleration_y(-2000);
     physic.set_velocity_y(physic.get_velocity_y() * 0.94);
   }
+#endif
 }
 
 void
@@ -614,12 +631,24 @@ Player::handle_input()
   if( controller->released( Controller::PEEK_RIGHT ) ) {
     peeking = AUTO;
   }
+  if( controller->released( Controller::UP ) ) {
+    peeking = AUTO;
+  }
+  if( controller->released( Controller::DOWN ) ) {
+    peeking = AUTO;
+  }
   if( controller->pressed( Controller::PEEK_LEFT ) ) {
     peeking = LEFT;
   }
   if( controller->pressed( Controller::PEEK_RIGHT ) ) {
     peeking = RIGHT;
   }
+  if( controller->pressed( Controller::UP ) ) {
+    peeking = UP;
+  }
+  if( controller->pressed( Controller::DOWN ) ) {
+    peeking = DOWN;
+  }
 
   /* Handle horizontal movement: */
   if (!backflipping) handle_horizontal_input();
@@ -661,9 +690,13 @@ Player::handle_input()
       if(moving_object) {
         moving_object->set_pos(pos);
       } else {
-        log_debug << "Non MovingObjetc grabbed?!?" << std::endl;
+        log_debug << "Non MovingObject grabbed?!?" << std::endl;
+      }
+      if(controller->hold(Controller::UP)) {
+        grabbed_object->ungrab(*this, UP);
+      } else {
+        grabbed_object->ungrab(*this, dir);
       }
-      grabbed_object->ungrab(*this, dir);
       grabbed_object = NULL;
     }
   }
@@ -688,11 +721,16 @@ Player::try_grab()
       if(!portable->is_portable())
         continue;
 
+      // make sure the Portable is a MovingObject
       MovingObject* moving_object = dynamic_cast<MovingObject*> (portable);
-      assert(portable);
+      assert(moving_object);
       if(moving_object == NULL)
         continue;
 
+      // make sure the Portable isn't currently non-solid
+      if(moving_object->get_group() == COLGROUP_DISABLED) continue;
+
+      // check if we are within reach
       if(moving_object->get_bbox().contains(pos)) {
         if (climbing) stop_climbing(*climbing);
         grabbed_object = portable;
@@ -988,7 +1026,7 @@ Player::draw(DrawingContext& context)
   else if (safe_timer.started() && size_t(game_time*40)%2)
     ;  // don't draw Tux
   else
-    tux_body->draw(context, get_pos(), layer);
+    tux_body->draw(context, get_pos(), layer, grabbed_object);
 
 }
 
@@ -998,6 +1036,7 @@ Player::collision_tile(uint32_t tile_attributes)
   if(tile_attributes & Tile::HURTS)
     kill(false);
 
+#ifdef SWIMMING
   if( swimming ){
     if( tile_attributes & Tile::WATER ){
       no_water = false;
@@ -1011,6 +1050,7 @@ Player::collision_tile(uint32_t tile_attributes)
       sound_manager->play( "sounds/splash.ogg" );
     }
   }
+#endif
 }
 
 void