fixed broken 1-time animations in sprites, fixed collision code returning no-collisio...
[supertux.git] / src / player.cpp
index e50bdab..6608f8c 100644 (file)
 #include "gameloop.h"
 #include "trigger/trigger_base.h"
 
-// behavior definitions:
-#define TILES_FOR_BUTTJUMP 3
-// animation times (in ms):
-#define SHOOTING_TIME .150
-
-// time before idle animation starts
-#define IDLE_TIME 2.500
+static const int TILES_FOR_BUTTJUMP = 3;
+static const float SHOOTING_TIME = .150;
+/// time before idle animation starts
+static const float IDLE_TIME = 2.5;
+
+static const float WALK_ACCELERATION_X = 300;
+static const float RUN_ACCELERATION_X = 400;
+static const float SKID_XM = 200;
+static const float SKID_TIME = .3;
+static const float MAX_WALK_XM = 230;
+static const float MAX_RUN_XM = 320;
+static const float WALK_SPEED = 100;
 
 // growing animation
 Surface* growingtux_left[GROWING_FRAMES];
@@ -91,29 +96,16 @@ void player_input_init(player_input_type* pplayer_input)
 }
 
 void
-TuxBodyParts::set_action(std::string action)
+TuxBodyParts::set_action(std::string action, int loops)
 {
   if(head != NULL)
-    head->set_action(action);
+    head->set_action(action, loops);
   if(body != NULL)
-    body->set_action(action);
+    body->set_action(action, loops);
   if(arms != NULL)
-    arms->set_action(action);
+    arms->set_action(action, loops);
   if(feet != NULL)
-    feet->set_action(action);
-}
-
-void
-TuxBodyParts::one_time_animation()
-{
-  if(head != NULL)
-    head->start_animation(1);
-  if(body != NULL)
-    body->start_animation(1);
-  if(arms != NULL)
-    arms->start_animation(1);
-  if(feet != NULL)
-    feet->start_animation(1);
+    feet->set_action(action, loops);
 }
 
 void
@@ -144,7 +136,7 @@ Player::init()
 {
   holding_something = false;
 
-  bbox.set_size(32, 32);
+  bbox.set_size(31.8, 31.8);
 
   size = SMALL;
   got_power = NONE_POWER;
@@ -401,6 +393,14 @@ Player::handle_horizontal_input()
   }
 #endif
 
+  // extend/shrink tux collision rectangle so that we fall through/walk over 1
+  // tile holes
+  if(fabsf(vx) > MAX_WALK_XM) {
+    bbox.set_width(33);
+  } else {
+    bbox.set_width(31.8);
+  }
+
   physic.set_velocity(vx, vy);
   physic.set_acceleration(ax, ay);
 }
@@ -673,13 +673,13 @@ Player::handle_input()
     {
       duck = true;
       bbox.move(Vector(0, 32));
-      bbox.set_height(32);
+      bbox.set_height(31.8);
     }
   else if(input.down == UP && size == BIG && duck)
     {
       // try if we can really unduck
       bbox.move(Vector(0, -32));
-      bbox.set_height(64);
+      bbox.set_height(63.8);
       duck = false;
       // FIXME
 #if 0
@@ -689,7 +689,7 @@ Player::handle_input()
       } else {
         // undo the ducking changes
         bbox.move(Vector(0, 32));
-        bbox.set_height(32);
+        bbox.set_height(31.8);
       }
 #endif
     }
@@ -702,7 +702,7 @@ Player::grow(bool animate)
     return;
   
   size = BIG;
-  bbox.set_height(64);
+  bbox.set_height(63.8);
   bbox.move(Vector(0, -32));
 
   if(animate)
@@ -789,11 +789,9 @@ Player::draw(DrawingContext& context)
     if(size == BIG)
       {
       if(dir == LEFT)
-        tux_body->head->set_action("idle-left");
+        tux_body->head->set_action("idle-left", 1);
       else // dir == RIGHT
-        tux_body->head->set_action("idle-right");
-
-      tux_body->head->start_animation(1);
+        tux_body->head->set_action("idle-right", 1);
       }
 
     }
@@ -872,10 +870,6 @@ Player::draw(DrawingContext& context)
 HitResponse
 Player::collision(GameObject& other, const CollisionHit& hit)
 {
-  if(dying) {
-    return FORCE_MOVE;
-  }
-
   if(other.get_flags() & FLAG_SOLID) {
     if(hit.normal.y < 0) { // landed on floor?
       if (physic.get_velocity_y() < 0)
@@ -885,8 +879,7 @@ Player::collision(GameObject& other, const CollisionHit& hit)
       physic.set_velocity_y(.1);
     }
     
-    if(fabsf(hit.normal.x) > .5) { // hit on the side?
-      printf("s"); fflush(stdout);
+    if(fabsf(hit.normal.x) > .9) { // hit on the side?
       physic.set_velocity_x(0);
     }
 
@@ -936,7 +929,7 @@ Player::kill(HurtMode mode)
           growing_timer.start(GROWING_TIME);
           safe_timer.start(TUX_SAFE_TIME + GROWING_TIME);
           size = SMALL;
-          bbox.set_height(32);
+          bbox.set_height(31.8);
           duck = false;
         }
     }
@@ -948,6 +941,7 @@ Player::kill(HurtMode mode)
       --player_status.lives;
       dying = DYING_SQUISHED;
       dying_timer.start(3.0);
+      flags |= FLAG_NO_COLLDET;
     }
 }
 
@@ -957,7 +951,7 @@ Player::remove_powerups()
 {
   got_power = NONE_POWER;
   size = SMALL;
-  bbox.set_height(32);
+  bbox.set_height(31.8);
 }
 
 void