Improved buttons. You can create new level-subsets via the leveleditor now. Better...
[supertux.git] / src / player.c
index 919596c..8b567cb 100644 (file)
@@ -71,6 +71,7 @@ void player_init(player_type* pplayer)
   timer_init(&pplayer->invincible_timer,YES);
   timer_init(&pplayer->skidding_timer,YES);
   timer_init(&pplayer->safe_timer,YES);
+  timer_init(&pplayer->frame_timer,YES);
   physic_init(&pplayer->hphysic);
   physic_init(&pplayer->vphysic);
 }
@@ -123,6 +124,9 @@ void player_level_begin(player_type* pplayer)
   timer_init(&pplayer->invincible_timer,YES);
   timer_init(&pplayer->skidding_timer,YES);
   timer_init(&pplayer->safe_timer,YES);
+  timer_init(&pplayer->frame_timer,YES);
+  physic_init(&pplayer->hphysic);
+  physic_init(&pplayer->vphysic);
 }
 
 void player_action(player_type* pplayer)
@@ -155,24 +159,22 @@ void player_action(player_type* pplayer)
             {
               physic_set_state(&pplayer->vphysic,PH_VT);
               physic_set_start_vy(&pplayer->vphysic,0.);
-             DEBUG_MSG("Ich bin jetzt ordentlich am Punkten"); 
             }
           pplayer->base.ym = physic_get_velocity(&pplayer->vphysic);
         }
       else
         {
-           /* Land: */
+          /* Land: */
 
           if (pplayer->base.ym > 0)
             {
               pplayer->base.y = (int)(((int)(pplayer->base.y +1) / 32) * 32);
-             printf("%f",pplayer->base.y);
               pplayer->base.ym = 0;
             }
           physic_init(&pplayer->vphysic);
         }
 
-      while(issolid( pplayer->base.x + 16,  pplayer->base.y + pplayer->base.height) && !issolid( pplayer->base.x + 16,  pplayer->base.y))
+      while(issolid( pplayer->base.x + 16,  pplayer->base.y + pplayer->base.height) && !issolid( pplayer->base.x + 16,  pplayer->base.y + 1))
         {
           --pplayer->base.y;
         }
@@ -189,13 +191,12 @@ void player_action(player_type* pplayer)
           --pplayer->base.x;
         }
 
-      if(pplayer->base.ym <= 0)
+      if(pplayer->base.ym < 0)
         {
 
           if (isbrick(pplayer->base.x, pplayer->base.y) ||
               isfullbox(pplayer->base.x, pplayer->base.y))
             {
-              DEBUG_MSG("My sear");
               trygrabdistro(pplayer->base.x, pplayer->base.y - 32,BOUNCE);
               trybumpbadguy(pplayer->base.x, pplayer->base.y - 64);
 
@@ -230,7 +231,6 @@ void player_action(player_type* pplayer)
                   add_bouncy_distro((((int)pplayer->base.x)
                                      / 32) * 32,
                                     ((int)pplayer->base.y / 32) * 32);
-                  DEBUG_MSG("should work");
                   if (counting_distros == NO)
                     {
                       counting_distros = YES;
@@ -250,7 +250,6 @@ void player_action(player_type* pplayer)
                   add_bouncy_distro((((int)pplayer->base.x + 31)
                                      / 32) * 32,
                                     ((int)pplayer->base.y / 32) * 32);
-                  DEBUG_MSG("+31?");
                   if (counting_distros == NO)
                     {
                       counting_distros = YES;
@@ -265,103 +264,260 @@ void player_action(player_type* pplayer)
                   distros++;
                 }
             }
-           }
+        }
 
-          player_grabdistros(pplayer);
+      player_grabdistros(pplayer);
 
-          /* FIXME: this code is COMPLETLY broken!!! */
-          /* if (issolid(pplayer->base.x, pplayer->base.y + 31) &&
-               !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y + 31))
+      /* FIXME: this code is COMPLETLY broken!!! */
+      /* if (issolid(pplayer->base.x, pplayer->base.y + 31) &&
+           !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y + 31))
+         {
+           while (issolid(pplayer->base.x, pplayer->base.y + 31))
              {
-               while (issolid(pplayer->base.x, pplayer->base.y + 31))
-                 {
-                   if (pplayer->base.xm < 0)
-                     pplayer->base.x++;
-                   else if (pplayer->base.xm > 0)
-                     pplayer->base.x--;
-                 }
-
-               pplayer->base.xm = 0;
-             }*/
-
-          /*if (issolid(pplayer->base.x, pplayer->base.y) &&
-              !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y))
-            {
-              while (issolid(pplayer->base.x, (pplayer->base.y)))
-                {
-                  if (pplayer->base.xm < 0)
-                    pplayer->base.x++;
-                  else if (pplayer->base.xm > 0)
-                    pplayer->base.x--;
-                }
+               if (pplayer->base.xm < 0)
+                 pplayer->base.x++;
+               else if (pplayer->base.xm > 0)
+                 pplayer->base.x--;
+             }
 
-              pplayer->base.xm = 0;
-            }*/
+           pplayer->base.xm = 0;
+         }*/
 
-          /*if (issolid(pplayer->base.x, pplayer->base.y + 31))
+      /*if (issolid(pplayer->base.x, pplayer->base.y) &&
+          !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y))
+        {
+          while (issolid(pplayer->base.x, (pplayer->base.y)))
             {
-              /* Set down properly: * /
+              if (pplayer->base.xm < 0)
+                pplayer->base.x++;
+              else if (pplayer->base.xm > 0)
+                pplayer->base.x--;
+            }
+
+          pplayer->base.xm = 0;
+        }*/
+
+      /*if (issolid(pplayer->base.x, pplayer->base.y + 31))
+        {
+          /* Set down properly: * /
 
-              int debug_int = 0;
-              while (issolid(pplayer->base.x, pplayer->base.y + 31))
+          int debug_int = 0;
+          while (issolid(pplayer->base.x, pplayer->base.y + 31))
+            {
+              ++debug_int;
+              if(debug_int > 32)
                 {
-                  ++debug_int;
-                  if(debug_int > 32)
-                    {
-                      DEBUG_MSG("FIXME - UNDER certain circumstances I'm hanging in a loop here!");
-                      /*the circumstances are:
-                      issolid() is true and base.ym == 0
-                      use of floating point varibles for base stuff* /
-                      break;
-                    }
-                  if (pplayer->base.ym < 0)
-                    pplayer->base.y++;
-                  else if (pplayer->base.ym > 0)
-                    pplayer->base.y--;
+                  DEBUG_MSG("FIXME - UNDER certain circumstances I'm hanging in a loop here!");
+                  /*the circumstances are:
+                  issolid() is true and base.ym == 0
+                  use of floating point varibles for base stuff* /
+                  break;
                 }
+              if (pplayer->base.ym < 0)
+                pplayer->base.y++;
+              else if (pplayer->base.ym > 0)
+                pplayer->base.y--;
+            }
 
 
-              /* Reset score multiplier (for multi-hits): */
+          /* Reset score multiplier (for multi-hits): */
 
-          if (pplayer->base.ym > 0)
-            score_multiplier = 1;
+      if (pplayer->base.ym > 2)
+        score_multiplier = 1;
 
 
-          /* Stop jumping! * /
+      /* Stop jumping! * /
 
+      pplayer->base.ym = 0;
+      pplayer->jumping = NO;
+      pplayer->input.up = UP;
+      }
+      /* FIXME: this code is COMPLETLY broken!!! */
+      /*if (issolid(pplayer->base.x, pplayer->base.y) ||
+          (pplayer->size == BIG && !pplayer->duck &&
+           (issolid(pplayer->base.x, pplayer->base.y - 32))))
+        {*/
+      /*if (!issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y) &&
+          (pplayer->size == SMALL || pplayer->duck ||
+           !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32)))* /
+
+      if (((!issolid(pplayer->base.x, pplayer->base.y- pplayer->base.ym * frame_ratio) && (issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x, pplayer->base.y+31))))
+      ||((!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y) && (issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x+32, pplayer->base.y)))))
+          /*(pplayer->size == SMALL || pplayer->duck ||
+           !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32))* /
+        {
+          pplayer->base.y = pplayer->base.y- pplayer->base.ym * frame_ratio;
           pplayer->base.ym = 0;
-          pplayer->jumping = NO;
-          pplayer->input.up = UP;
-          }
-          /* FIXME: this code is COMPLETLY broken!!! */
-          /*if (issolid(pplayer->base.x, pplayer->base.y) ||
-              (pplayer->size == BIG && !pplayer->duck &&
-               (issolid(pplayer->base.x, pplayer->base.y - 32))))
-            {*/
-          /*if (!issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y) &&
-              (pplayer->size == SMALL || pplayer->duck ||
-               !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32)))* /
+        }
+
+      if (((issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x+32, pplayer->base.y)) &&  (!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y))
+          /*(pplayer->size == SMALL || pplayer->duck ||
+           !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32))* /) || 
+      (!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y+pplayer->base.height) && (issolid(pplayer->base.x, pplayer->base.y+pplayer->base.height) || issolid(pplayer->base.x +32, pplayer->base.y+pplayer->base.height))))
+        {
+      pplayer->base.x = pplayer->base.x- pplayer->base.xm * frame_ratio;
+          pplayer->base.xm = 0;
+        }
 
-          if (((!issolid(pplayer->base.x, pplayer->base.y- pplayer->base.ym * frame_ratio) && (issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x, pplayer->base.y+31))))
-          ||((!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y) && (issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x+32, pplayer->base.y)))))
-              /*(pplayer->size == SMALL || pplayer->duck ||
-               !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32))* /
+          if (pplayer->base.ym <= 0)
             {
-              pplayer->base.y = pplayer->base.y- pplayer->base.ym * frame_ratio;
-              pplayer->base.ym = 0;
+      if (isbrick(pplayer->base.x, pplayer->base.y) ||
+          isfullbox(pplayer->base.x, pplayer->base.y))
+        {
+          trygrabdistro(pplayer->base.x, pplayer->base.y - 32,BOUNCE);
+          trybumpbadguy(pplayer->base.x, pplayer->base.y - 64);
+          bumpbrick(pplayer->base.x, pplayer->base.y);
+          tryemptybox(pplayer->base.x, pplayer->base.y);
+        }
+
+      if (isbrick(pplayer->base.x+ 31, pplayer->base.y) ||
+          isfullbox(pplayer->base.x+ 31, pplayer->base.y))
+        {
+          trygrabdistro(pplayer->base.x+ 31, pplayer->base.y - 32,BOUNCE);
+          trybumpbadguy(pplayer->base.x+ 31, pplayer->base.y - 64);
+          bumpbrick(pplayer->base.x+ 31, pplayer->base.y);
+          tryemptybox(pplayer->base.x+ 31, pplayer->base.y);
+        }
+      /* Get a distro from a brick? * /
+
+      if (shape(pplayer->base.x, pplayer->base.y) == 'x' ||
+          shape(pplayer->base.x, pplayer->base.y) == 'y')
+        {
+          add_bouncy_distro(((pplayer->base.x+ 1)
+                             / 32) * 32,
+                            (int)(pplayer->base.y / 32) * 32);
+
+          if (counting_distros == NO)
+            {
+              counting_distros = YES;
+              distro_counter = 100;
             }
 
-          if (((issolid(pplayer->base.x, pplayer->base.y) || issolid(pplayer->base.x+32, pplayer->base.y)) &&  (!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y))
-              /*(pplayer->size == SMALL || pplayer->duck ||
-               !issolid(pplayer->base.x- pplayer->base.xm, pplayer->base.y - 32))* /) || 
-          (!issolid(pplayer->base.x - pplayer->base.xm * frame_ratio, pplayer->base.y+pplayer->base.height) && (issolid(pplayer->base.x, pplayer->base.y+pplayer->base.height) || issolid(pplayer->base.x +32, pplayer->base.y+pplayer->base.height))))
+          if (distro_counter <= 0)
+            level_change(&current_level,pplayer->base.x,pplayer->base.y, 'a');
+
+          play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
+          score = score + SCORE_DISTRO;
+          distros++;
+        }
+      else if (shape(pplayer->base.x+ 31, pplayer->base.y) == 'x' ||
+               shape(pplayer->base.x+ 31, pplayer->base.y) == 'y')
+        {
+          add_bouncy_distro(((pplayer->base.x+ 1 + 31)
+                             / 32) * 32,
+                            (int)(pplayer->base.y / 32) * 32);
+
+          if (counting_distros == NO)
             {
-          pplayer->base.x = pplayer->base.x- pplayer->base.xm * frame_ratio;
-              pplayer->base.xm = 0;
+              counting_distros = YES;
+              distro_counter = 100;
             }
 
+          if (distro_counter <= 0)
+            level_change(&current_level,pplayer->base.x+ 31, pplayer->base.y, 'a');
+
+          play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
+          score = score + SCORE_DISTRO;
+          distros++;
+        }
+
+      }
+      else
+      {
+      pplayer->base.ym = 0;
+      pplayer->jumping = NO;
+      timer_start(&pplayer->jump_timer,MAX_JUMP_TIME);
+      }
+      /*}*/
+      /* Bump into things: * /
+       
+      if (issolid(pplayer->base.x, pplayer->base.y) ||
+          (pplayer->size == BIG && !pplayer->duck &&
+           (issolid(pplayer->base.x, pplayer->base.y - 32))))
+        {
+       
+          if (!issolid(pplayer->base.x, pplayer->base.y - pplayer->base.ym) &&
+              (pplayer->size == SMALL || pplayer->duck ||
+               !issolid(pplayer->base.x, pplayer->base.y - 32 - pplayer->base.ym)))
+            {
               if (pplayer->base.ym <= 0)
                 {
+                  /* Jumping up? */
+      /* FIXME: this code is COMPLETLY broken!!! */
+      if (pplayer->size == BIG)
+        {
+          /* Break bricks and empty boxes: * /
+
+          if (!pplayer->duck)
+            {
+              if (isbrick(pplayer->base.x, pplayer->base.y - 32) ||
+                  isfullbox(pplayer->base.x, pplayer->base.y - 32))
+                {
+                  trygrabdistro(pplayer->base.x, pplayer->base.y - 64, BOUNCE);
+                  trybumpbadguy(pplayer->base.x, pplayer->base.y - 96);
+
+                  if (isfullbox(pplayer->base.x, pplayer->base.y - 32))
+                    {
+                      bumpbrick(pplayer->base.x, pplayer->base.y - 32);
+                    }
+
+                  trybreakbrick(pplayer->base.x, pplayer->base.y - 32);
+                  tryemptybox(pplayer->base.x, pplayer->base.y - 32);
+                }
+
+              if (isbrick(pplayer->base.x+ 31, pplayer->base.y - 32) ||
+                  isfullbox(pplayer->base.x+ 31, pplayer->base.y - 32))
+                {
+                  trygrabdistro(pplayer->base.x+ 31,
+                                pplayer->base.y - 64,
+                                BOUNCE);
+                  trybumpbadguy(pplayer->base.x+ 31,
+                                pplayer->base.y - 96);
+
+                  if (isfullbox(pplayer->base.x+ 31, pplayer->base.y - 32))
+                    {
+                      bumpbrick(pplayer->base.x+ 31, pplayer->base.y - 32);
+                    }
+
+                  trybreakbrick(pplayer->base.x+ 31,
+                                pplayer->base.y - 32);
+                  tryemptybox(pplayer->base.x+ 31,
+                              pplayer->base.y - 32);
+                }
+            }
+          else /* ducking * /
+            {
+              if (isbrick(pplayer->base.x, pplayer->base.y) ||
+                  isfullbox(pplayer->base.x, pplayer->base.y))
+                {
+                  trygrabdistro(pplayer->base.x, pplayer->base.y - 32,BOUNCE);
+                  trybumpbadguy(pplayer->base.x, pplayer->base.y - 64);
+                  if (isfullbox(pplayer->base.x, pplayer->base.y))
+                    bumpbrick(pplayer->base.x, pplayer->base.y);
+                  trybreakbrick(pplayer->base.x, pplayer->base.y);
+                  tryemptybox(pplayer->base.x, pplayer->base.y);
+                }
+
+              if (isbrick(pplayer->base.x+ 31, pplayer->base.y) ||
+                  isfullbox(pplayer->base.x+ 31, pplayer->base.y))
+                {
+                  trygrabdistro(pplayer->base.x+ 31,
+                                pplayer->base.y - 32,
+                                BOUNCE);
+                  trybumpbadguy(pplayer->base.x+ 31,
+                                pplayer->base.y - 64);
+                  if (isfullbox(pplayer->base.x+ 31, pplayer->base.y))
+                    bumpbrick(pplayer->base.x+ 31, pplayer->base.y);
+                  trybreakbrick(pplayer->base.x+ 31, pplayer->base.y);
+                  tryemptybox(pplayer->base.x+ 31, pplayer->base.y);
+                }
+            }
+          }
+          else
+          {
+          /* It's a brick and we're small, make the brick
+             bounce, and grab any distros above it: *  /
+
           if (isbrick(pplayer->base.x, pplayer->base.y) ||
               isfullbox(pplayer->base.x, pplayer->base.y))
             {
@@ -379,6 +535,8 @@ void player_action(player_type* pplayer)
               bumpbrick(pplayer->base.x+ 31, pplayer->base.y);
               tryemptybox(pplayer->base.x+ 31, pplayer->base.y);
             }
+
+
           /* Get a distro from a brick? * /
 
           if (shape(pplayer->base.x, pplayer->base.y) == 'x' ||
@@ -421,184 +579,25 @@ void player_action(player_type* pplayer)
               score = score + SCORE_DISTRO;
               distros++;
             }
+          }
+
 
+          /* Bump head: * /
+
+          pplayer->base.y = (int)(pplayer->base.y / 32) * 32 + 30;
           }
           else
           {
+          /* Land on feet: * /
+
+          pplayer->base.y = (int)(pplayer->base.y / 32) * 32 - 32;
+          }
+
           pplayer->base.ym = 0;
           pplayer->jumping = NO;
           timer_start(&pplayer->jump_timer,MAX_JUMP_TIME);
-          }
-          /*}*/
-          /* Bump into things: * /
-           
-          if (issolid(pplayer->base.x, pplayer->base.y) ||
-              (pplayer->size == BIG && !pplayer->duck &&
-               (issolid(pplayer->base.x, pplayer->base.y - 32))))
-            {
-           
-              if (!issolid(pplayer->base.x, pplayer->base.y - pplayer->base.ym) &&
-                  (pplayer->size == SMALL || pplayer->duck ||
-                   !issolid(pplayer->base.x, pplayer->base.y - 32 - pplayer->base.ym)))
-                {
-                  if (pplayer->base.ym <= 0)
-                    {
-                      /* Jumping up? */
-          /* FIXME: this code is COMPLETLY broken!!! */
-          if (pplayer->size == BIG)
-            {
-              /* Break bricks and empty boxes: * /
-
-              if (!pplayer->duck)
-                {
-                  if (isbrick(pplayer->base.x, pplayer->base.y - 32) ||
-                      isfullbox(pplayer->base.x, pplayer->base.y - 32))
-                    {
-                      trygrabdistro(pplayer->base.x, pplayer->base.y - 64, BOUNCE);
-                      trybumpbadguy(pplayer->base.x, pplayer->base.y - 96);
-
-                      if (isfullbox(pplayer->base.x, pplayer->base.y - 32))
-                        {
-                          bumpbrick(pplayer->base.x, pplayer->base.y - 32);
-                        }
-
-                      trybreakbrick(pplayer->base.x, pplayer->base.y - 32);
-                      tryemptybox(pplayer->base.x, pplayer->base.y - 32);
-                    }
-
-                  if (isbrick(pplayer->base.x+ 31, pplayer->base.y - 32) ||
-                      isfullbox(pplayer->base.x+ 31, pplayer->base.y - 32))
-                    {
-                      trygrabdistro(pplayer->base.x+ 31,
-                                    pplayer->base.y - 64,
-                                    BOUNCE);
-                      trybumpbadguy(pplayer->base.x+ 31,
-                                    pplayer->base.y - 96);
-
-                      if (isfullbox(pplayer->base.x+ 31, pplayer->base.y - 32))
-                        {
-                          bumpbrick(pplayer->base.x+ 31, pplayer->base.y - 32);
-                        }
-
-                      trybreakbrick(pplayer->base.x+ 31,
-                                    pplayer->base.y - 32);
-                      tryemptybox(pplayer->base.x+ 31,
-                                  pplayer->base.y - 32);
-                    }
-                }
-              else /* ducking * /
-                {
-                  if (isbrick(pplayer->base.x, pplayer->base.y) ||
-                      isfullbox(pplayer->base.x, pplayer->base.y))
-                    {
-                      trygrabdistro(pplayer->base.x, pplayer->base.y - 32,BOUNCE);
-                      trybumpbadguy(pplayer->base.x, pplayer->base.y - 64);
-                      if (isfullbox(pplayer->base.x, pplayer->base.y))
-                        bumpbrick(pplayer->base.x, pplayer->base.y);
-                      trybreakbrick(pplayer->base.x, pplayer->base.y);
-                      tryemptybox(pplayer->base.x, pplayer->base.y);
-                    }
-
-                  if (isbrick(pplayer->base.x+ 31, pplayer->base.y) ||
-                      isfullbox(pplayer->base.x+ 31, pplayer->base.y))
-                    {
-                      trygrabdistro(pplayer->base.x+ 31,
-                                    pplayer->base.y - 32,
-                                    BOUNCE);
-                      trybumpbadguy(pplayer->base.x+ 31,
-                                    pplayer->base.y - 64);
-                      if (isfullbox(pplayer->base.x+ 31, pplayer->base.y))
-                        bumpbrick(pplayer->base.x+ 31, pplayer->base.y);
-                      trybreakbrick(pplayer->base.x+ 31, pplayer->base.y);
-                      tryemptybox(pplayer->base.x+ 31, pplayer->base.y);
-                    }
-                }
-              }
-              else
-              {
-              /* It's a brick and we're small, make the brick
-                 bounce, and grab any distros above it: *  /
-
-              if (isbrick(pplayer->base.x, pplayer->base.y) ||
-                  isfullbox(pplayer->base.x, pplayer->base.y))
-                {
-                  trygrabdistro(pplayer->base.x, pplayer->base.y - 32,BOUNCE);
-                  trybumpbadguy(pplayer->base.x, pplayer->base.y - 64);
-                  bumpbrick(pplayer->base.x, pplayer->base.y);
-                  tryemptybox(pplayer->base.x, pplayer->base.y);
-                }
-
-              if (isbrick(pplayer->base.x+ 31, pplayer->base.y) ||
-                  isfullbox(pplayer->base.x+ 31, pplayer->base.y))
-                {
-                  trygrabdistro(pplayer->base.x+ 31, pplayer->base.y - 32,BOUNCE);
-                  trybumpbadguy(pplayer->base.x+ 31, pplayer->base.y - 64);
-                  bumpbrick(pplayer->base.x+ 31, pplayer->base.y);
-                  tryemptybox(pplayer->base.x+ 31, pplayer->base.y);
-                }
-
-
-              /* Get a distro from a brick? * /
-
-              if (shape(pplayer->base.x, pplayer->base.y) == 'x' ||
-                  shape(pplayer->base.x, pplayer->base.y) == 'y')
-                {
-                  add_bouncy_distro(((pplayer->base.x+ 1)
-                                     / 32) * 32,
-                                    (int)(pplayer->base.y / 32) * 32);
-
-                  if (counting_distros == NO)
-                    {
-                      counting_distros = YES;
-                      distro_counter = 100;
-                    }
-
-                  if (distro_counter <= 0)
-                    level_change(&current_level,pplayer->base.x,pplayer->base.y, 'a');
-
-                  play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
-                  score = score + SCORE_DISTRO;
-                  distros++;
-                }
-              else if (shape(pplayer->base.x+ 31, pplayer->base.y) == 'x' ||
-                       shape(pplayer->base.x+ 31, pplayer->base.y) == 'y')
-                {
-                  add_bouncy_distro(((pplayer->base.x+ 1 + 31)
-                                     / 32) * 32,
-                                    (int)(pplayer->base.y / 32) * 32);
-
-                  if (counting_distros == NO)
-                    {
-                      counting_distros = YES;
-                      distro_counter = 100;
-                    }
-
-                  if (distro_counter <= 0)
-                    level_change(&current_level,pplayer->base.x+ 31, pplayer->base.y, 'a');
-
-                  play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
-                  score = score + SCORE_DISTRO;
-                  distros++;
-                }
-              }
-
-
-              /* Bump head: * /
-
-              pplayer->base.y = (int)(pplayer->base.y / 32) * 32 + 30;
-              }
-              else
-              {
-              /* Land on feet: * /
-
-              pplayer->base.y = (int)(pplayer->base.y / 32) * 32 - 32;
-              }
-
-              pplayer->base.ym = 0;
-              pplayer->jumping = NO;
-              timer_start(&pplayer->jump_timer,MAX_JUMP_TIME);
-              }*/
-            }
+          }*/
+        }
     }
 
 
@@ -807,19 +806,6 @@ void player_handle_vertical_input(player_type *pplayer)
     }
   else if(pplayer->input.up == UP && pplayer->jumping == YES)
     {
-      /* Land: * /
-      DEBUG_MSG("Stop Jump");
-      pplayer->jumping = NO;
-
-      if (pplayer->base.ym > 0)
-        {
-          pplayer->base.y = (int)(pplayer->base.y / 32) * 32;
-          pplayer->base.ym = 0;
-        }
-      physic_init(&pplayer->vphysic);
-      }
-      else if(pplayer->input.up == UP)
-      {*/
       if (issolid(pplayer->base.x + 16, pplayer->base.y + pplayer->base.height + 1))
         {
           physic_init(&pplayer->vphysic);
@@ -828,22 +814,18 @@ void player_handle_vertical_input(player_type *pplayer)
       else
         {
           pplayer->jumping = NO;
-         printf("%f",physic_get_velocity(&pplayer->vphysic));
           if(physic_is_set(&pplayer->vphysic))
             {
-           if(physic_get_velocity(&pplayer->vphysic) < 0.)
-           {
-                       physic_set_state(&pplayer->vphysic,PH_VT);
-                           DEBUG_MSG("DUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDE");
-              physic_set_start_vy(&pplayer->vphysic,0);
-             }
+              if(physic_get_velocity(&pplayer->vphysic) < 0.)
+                {
+                  physic_set_state(&pplayer->vphysic,PH_VT);
+                  physic_set_start_vy(&pplayer->vphysic,0);
+                }
             }
           else
             {
-           DEBUG_MSG("CHUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUHHHHAAA");
               if(!physic_is_set(&pplayer->vphysic))
                 {
-                           DEBUG_MSG("CHUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUHHHHAAA");
                   physic_set_state(&pplayer->vphysic,PH_VT);
                 }
             }
@@ -903,9 +885,17 @@ void player_input(player_type *pplayer)
   else
     {
       if(pplayer->base.xm > 0)
-        pplayer->base.xm = (int)(pplayer->base.xm - frame_ratio);
+        {
+          pplayer->base.xm = (int)(pplayer->base.xm - frame_ratio);
+          if(pplayer->base.xm < 0)
+            pplayer->base.xm = 0;
+        }
       else if(pplayer->base.xm < 0)
-        pplayer->base.xm = (int)(pplayer->base.xm + frame_ratio);
+        {
+          pplayer->base.xm = (int)(pplayer->base.xm + frame_ratio);
+          if(pplayer->base.xm > 0)
+            pplayer->base.xm = 0;
+        }
     }
 
   /* Jump/jumping? */
@@ -945,21 +935,25 @@ void player_input(player_type *pplayer)
 
   /* (Tux): */
 
-  if (pplayer->input.right == UP && pplayer->input.left == UP)
+  if(!timer_check(&pplayer->frame_timer))
     {
-      pplayer->frame_main = 1;
-      pplayer->frame = 1;
-    }
-  else
-    {
-      if ((pplayer->input.fire == DOWN && (frame % 2) == 0) ||
-          (frame % 4) == 0)
-        pplayer->frame_main = (pplayer->frame_main + 1) % 4;
+      timer_start(&pplayer->frame_timer,25);
+      if (pplayer->input.right == UP && pplayer->input.left == UP)
+        {
+          pplayer->frame_main = 1;
+          pplayer->frame = 1;
+        }
+      else
+        {
+          if ((pplayer->input.fire == DOWN && (frame % 2) == 0) ||
+              (frame % 4) == 0)
+            pplayer->frame_main = (pplayer->frame_main + 1) % 4;
 
-      pplayer->frame = pplayer->frame_main;
+          pplayer->frame = pplayer->frame_main;
 
-      if (pplayer->frame == 3)
-        pplayer->frame = 1;
+          if (pplayer->frame == 3)
+            pplayer->frame = 1;
+        }
     }
 
 }
@@ -1269,7 +1263,8 @@ void player_collision(player_type* pplayer, void* p_c_object, int c_object)
                       else
                         {
                           pbad_c->dying = FALLING;
-                          pbad_c->base.ym = -8;
+                          physic_set_state(&pplayer->vphysic,PH_VT);
+                          physic_set_start_vy(&pplayer->vphysic,-2.);
                           play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
                         }
                     }
@@ -1284,7 +1279,8 @@ void player_collision(player_type* pplayer, void* p_c_object, int c_object)
               else
                 {
                   pbad_c->dying = FALLING;
-                  pbad_c->base.ym = -8;
+                  physic_set_state(&pplayer->vphysic,PH_VT);
+                  physic_set_start_vy(&pplayer->vphysic,-2.);
                   play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
                 }
             }