Fixed creating level-subset again.
[supertux.git] / src / badguy.cpp
index 93b2c07..5e33158 100644 (file)
@@ -193,15 +193,17 @@ BadGuy::BadGuy(float x, float y, BadGuyKind kind_, bool stay_on_platform_)
   }
 
   // if we're in a solid tile at start correct that now
-  if(kind != BAD_FLAME && kind != BAD_FISH && collision_object_map(base)) {
-    printf("Warning: badguy started in wall!.\n");
-    while(collision_object_map(base))
-      --base.y;
-  }
+  if(kind != BAD_FLAME && kind != BAD_FISH && collision_object_map(base)) 
+    {
+      std::cout << "Warning: badguy started in wall: kind: " << badguykind_to_string(kind) 
+                << " pos: (" << base.x << ", " << base.y << ")" << std::endl;
+      while(collision_object_map(base))
+        --base.y;
+    }
 }
 
 void
-BadGuy::action_mriceblock(float frame_ratio)
+BadGuy::action_mriceblock(double frame_ratio)
 {
   Player& tux = *World::current()->get_tux();
 
@@ -348,12 +350,12 @@ BadGuy::fall()
                   if (dir == LEFT)
                   {
                     dir = RIGHT;
-                    physic.set_velocity_x(fabs(physic.get_velocity_x()));
+                    physic.set_velocity_x(fabsf(physic.get_velocity_x()));
                   } 
                   else
                   {
                     dir = LEFT;
-                    physic.set_velocity_x(-fabs(physic.get_velocity_x()));
+                    physic.set_velocity_x(-fabsf(physic.get_velocity_x()));
                   }
                 }
             }
@@ -372,14 +374,17 @@ BadGuy::remove_me()
 }
 
 void
-BadGuy::action_jumpy(float frame_ratio)
+BadGuy::action_jumpy(double frame_ratio)
 {
-  if (fabsf(physic.get_velocity_y()) < 2.5f)
+  const float vy = physic.get_velocity_y();
+
+  // XXX: These tests *should* use location from ground, not velocity
+  if (fabsf(vy) > 5.6f)
+    set_sprite(img_jumpy_left_down, img_jumpy_left_down);
+  else if (fabsf(vy) > 5.3f)
     set_sprite(img_jumpy_left_middle, img_jumpy_left_middle);
-  else if (physic.get_velocity_y() < 0)
+  else
     set_sprite(img_jumpy_left_up, img_jumpy_left_up);
-  else 
-    set_sprite(img_jumpy_left_down, img_jumpy_left_down);
 
   Player& tux = *World::current()->get_tux();
 
@@ -412,7 +417,7 @@ BadGuy::action_jumpy(float frame_ratio)
 }
 
 void
-BadGuy::action_mrbomb(float frame_ratio)
+BadGuy::action_mrbomb(double frame_ratio)
 {
   if (dying == DYING_NOT)
     check_horizontal_bump(true);
@@ -425,7 +430,7 @@ BadGuy::action_mrbomb(float frame_ratio)
 }
 
 void
-BadGuy::action_bomb(float frame_ratio)
+BadGuy::action_bomb(double frame_ratio)
 {
   static const int TICKINGTIME = 1000;
   static const int EXPLODETIME = 1000;
@@ -462,7 +467,7 @@ BadGuy::action_bomb(float frame_ratio)
 }
 
 void
-BadGuy::action_stalactite(float frame_ratio)
+BadGuy::action_stalactite(double frame_ratio)
 {
   Player& tux = *World::current()->get_tux();
 
@@ -504,7 +509,7 @@ BadGuy::action_stalactite(float frame_ratio)
 }
 
 void
-BadGuy::action_flame(float frame_ratio)
+BadGuy::action_flame(double frame_ratio)
 {
     static const float radius = 100;
     static const float speed = 0.02;
@@ -515,7 +520,7 @@ BadGuy::action_flame(float frame_ratio)
 }
 
 void
-BadGuy::action_fish(float frame_ratio)
+BadGuy::action_fish(double frame_ratio)
 {
   static const float JUMPV = 6;
   static const int WAITTIME = 1000;
@@ -548,7 +553,7 @@ BadGuy::action_fish(float frame_ratio)
 }
 
 void
-BadGuy::action_bouncingsnowball(float frame_ratio)
+BadGuy::action_bouncingsnowball(double frame_ratio)
 {
   static const float JUMPV = 4.5;
     
@@ -582,7 +587,7 @@ BadGuy::action_bouncingsnowball(float frame_ratio)
 }
 
 void
-BadGuy::action_flyingsnowball(float frame_ratio)
+BadGuy::action_flyingsnowball(double frame_ratio)
 {
   static const float FLYINGSPEED = 1;
   static const int DIRCHANGETIME = 1000;
@@ -622,7 +627,7 @@ BadGuy::action_flyingsnowball(float frame_ratio)
 }
 
 void
-BadGuy::action_spiky(float frame_ratio)
+BadGuy::action_spiky(double frame_ratio)
 {
   if (dying == DYING_NOT)
     check_horizontal_bump();
@@ -643,7 +648,7 @@ BadGuy::action_spiky(float frame_ratio)
 }
 
 void
-BadGuy::action_snowball(float frame_ratio)
+BadGuy::action_snowball(double frame_ratio)
 {
   if (dying == DYING_NOT)
     check_horizontal_bump();
@@ -656,7 +661,7 @@ BadGuy::action_snowball(float frame_ratio)
 }
 
 void
-BadGuy::action(float frame_ratio)
+BadGuy::action(double frame_ratio)
 {
   // Remove if it's far off the screen:
   if (base.x < scroll_x - OFFSCREEN_DISTANCE)
@@ -723,6 +728,8 @@ BadGuy::action(float frame_ratio)
     case BAD_SNOWBALL:
       action_snowball(frame_ratio);
       break;
+    default:
+      break;
     }
 }
 
@@ -786,7 +793,8 @@ BadGuy::bump()
   if(kind == BAD_FLAME || kind == BAD_BOMB || kind == BAD_FISH
       || kind == BAD_FLYINGSNOWBALL)
     return;
-  
+
+  physic.set_velocity_y(3);
   kill_me(25);
 }
 
@@ -912,7 +920,6 @@ BadGuy::kill_me(int score)
   }
   
   physic.enable_gravity(true);
-  physic.set_velocity_y(0);
 
   /* Gain some points: */
     World::current()->add_score(base.x - scroll_x, base.y,
@@ -998,12 +1005,12 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type)
           if (pbad_c->dir == LEFT)
           {
             dir = RIGHT;
-            physic.set_velocity(fabs(physic.get_velocity_x()), 2);
+            physic.set_velocity(fabsf(physic.get_velocity_x()), 2);
           }
           else if (pbad_c->dir == RIGHT)
           {
             dir = LEFT;
-            physic.set_velocity(-fabs(physic.get_velocity_x()), 2);
+            physic.set_velocity(-fabsf(physic.get_velocity_x()), 2);
           }
 
 
@@ -1018,12 +1025,12 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type)
             if (dir == LEFT)
             {
               dir = RIGHT;
-              physic.set_velocity_x(fabs(physic.get_velocity_x()));
+              physic.set_velocity_x(fabsf(physic.get_velocity_x()));
             }
             else if (dir == RIGHT)
             {
               dir = LEFT;
-              physic.set_velocity_x(-fabs(physic.get_velocity_x()));
+              physic.set_velocity_x(-fabsf(physic.get_velocity_x()));
             }
 
           }