Powerup: Iceflower improvements
[supertux.git] / src / badguy / haywire.cpp
index 6dff5cc..b968de5 100644 (file)
@@ -32,7 +32,9 @@
 Haywire::Haywire(const Reader& reader) :
   WalkingBadguy(reader, "images/creatures/haywire/haywire.sprite", "left", "right"),
   is_exploding(false),
-  is_stunned(false)
+  time_until_explosion(0.0f),
+  is_stunned(false),
+  time_stunned(0.0f)
 {
   walk_speed = 80;
   max_drop_height = 16;
@@ -52,17 +54,6 @@ Haywire::Haywire(const Reader& reader) :
   sprite = sprite_manager->create( sprite_name );
 }
 
-/* Haywire created by a dispenser always gets default sprite atm.*/
-Haywire::Haywire(const Vector& pos, Direction d) :
-  WalkingBadguy(pos, d, "images/creatures/haywire/haywire.sprite", "left", "right"),
-  is_exploding(false),
-  is_stunned(false)
-{
-  walk_speed = 80;
-  max_drop_height = 16;
-  sound_manager->preload("sounds/explosion.wav");
-}
-
 HitResponse
 Haywire::collision(GameObject& object, const CollisionHit& hit)
 {
@@ -86,9 +77,14 @@ Haywire::collision_squished(GameObject& object)
   }
 
   if (is_stunned) {
-    player->bounce (*this);
+    if (player)
+      player->bounce (*this);
     return true;
   }
+  
+  if(WalkingBadguy::is_frozen()) {
+    WalkingBadguy::unfreeze();
+  }
 
   if (!is_exploding) {
     set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1);
@@ -97,12 +93,27 @@ Haywire::collision_squished(GameObject& object)
     set_walk_speed (160);
     time_until_explosion = TIME_EXPLOSION;
     is_exploding = true;
+
+    ticking.reset(sound_manager->create_sound_source("sounds/fizz.wav"));
+    ticking->set_position(get_pos());
+    ticking->set_looping(true);
+    ticking->set_reference_distance(32);
+    ticking->play();
+    grunting.reset(sound_manager->create_sound_source("sounds/grunts.ogg"));
+    grunting->set_position(get_pos());
+    grunting->set_looping(true);
+    grunting->set_reference_distance(32);
+    grunting->play();    
   }
 
   time_stunned = TIME_STUNNED;
   is_stunned = true;
+  physic.set_velocity_x (0.0);
+  physic.set_acceleration_x (0.0);
+
+  if (player)
+    player->bounce (*this);
 
-  player->bounce (*this);
   return true;
 }
 
@@ -110,6 +121,8 @@ void
 Haywire::active_update(float elapsed_time)
 {
   if (is_exploding) {
+    ticking->set_position(get_pos());
+    grunting->set_position(get_pos());
     if (elapsed_time >= time_until_explosion) {
       kill_fall ();
       return;
@@ -130,26 +143,32 @@ Haywire::active_update(float elapsed_time)
     }
   }
 
-  if (is_exploding && !turn_around_timer.started()) {
-    Player *p = Sector::current()->get_nearest_player (this->get_pos ());
+  if (is_exploding) {
+    Player *p = this->get_nearest_player ();
+    float target_velocity = 0.0;
 
     if (p) {
-      Direction player_dir = LEFT;
-
+      /* Player is on the right */
       if (p->get_pos ().x > this->get_pos ().x)
-        player_dir = RIGHT;
+        target_velocity = walk_speed;
+      else /* player in on the left */
+        target_velocity = (-1.0) * walk_speed;
+    } /* if (player) */
 
-      if (player_dir != dir)
-        turn_around ();
-    }
+    WalkingBadguy::active_update(elapsed_time, target_velocity);
+  }
+  else {
+    WalkingBadguy::active_update(elapsed_time);
   }
-
-  WalkingBadguy::active_update(elapsed_time);
 }
 
 void
 Haywire::kill_fall()
 {
+  if(is_exploding) {
+    ticking->stop();
+    grunting->stop();
+  }
   if(is_valid()) {
     remove_me();
     Explosion* explosion = new Explosion(get_bbox().get_middle());
@@ -159,13 +178,6 @@ Haywire::kill_fall()
   run_dead_script();
 }
 
-void
-Haywire::freeze()
-{
-  WalkingBadguy::freeze();
-  sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
-}
-
 bool
 Haywire::is_freezable() const
 {