Large icecrusher sprites also support eye animation, also eyes spin around while...
[supertux.git] / src / object / icecrusher.cpp
index e97fd62..7fd2f0e 100644 (file)
@@ -239,7 +239,7 @@ IceCrusher::draw(DrawingContext& context)
   context.push_target();
   context.set_target(DrawingContext::NORMAL);
   sprite->draw(context, get_pos(), layer);
-  if(!(state == CRUSHING)) // Remove if eyes are to be animated during crushing
+  if(!(state == CRUSHING) && sprite->has_action("whites"))
   {
     // draw icecrusher's eyes slightly behind
     lefteye->draw(context, get_pos()+eye_position(false), layer-1);
@@ -269,7 +269,7 @@ IceCrusher::found_victim()
 Vector
 IceCrusher::eye_position(bool right)
 {
-  if(!(state == CRUSHING))
+  if(state == IDLE)
   {
     Player* player = Sector::current()->get_nearest_player (this->get_bbox ());
     if(player)
@@ -285,11 +285,18 @@ IceCrusher::eye_position(bool right)
       const float displacement_y = player_focus_y - crusher_origin_y;
       const float displacement_mag = pow(pow(displacement_x, 2.0) + pow(displacement_y, 2.0), 0.5);
       // Determine weighting for eye displacement along x given icecrusher eye shape
-      int weight = ((displacement_x > 0) == right) ? 1 : 4;
+      int weight_x = sprite->get_width()/64 * ((displacement_x > 0) == right) ? 1 : 4;
+      int weight_y = sprite->get_width()/64 * 2;
 
-      return Vector(displacement_x/displacement_mag * weight, displacement_y/displacement_mag * 2 - 2);
+      return Vector(displacement_x/displacement_mag * weight_x, displacement_y/displacement_mag * weight_y - weight_y);
     }
   }
+  else if(state == RECOVERING)
+  {
+    // Eyes spin while icecrusher is recovering, giving a dazed impression
+    return Vector(sin((right ? 1 : -1) * get_pos().y/13) * sprite->get_width()/64 * 2 - (right ? 1 : -1) * sprite->get_width()/64 * 2,
+                  cos(get_pos().y/13) * sprite->get_width()/64 * 2 - sprite->get_width()/64 * 2);
+  }
 
   return Vector(0,0);
 }