Fix Tux walking backwards after automatic backflipping, fixes #1063
[supertux.git] / src / badguy / haywire.cpp
index 2252515..01a4b91 100644 (file)
@@ -34,13 +34,15 @@ Haywire::Haywire(const Reader& reader) :
   is_exploding(false),
   time_until_explosion(0.0f),
   is_stunned(false),
-  time_stunned(0.0f)
+  time_stunned(0.0f),
+  ticking(),
+  grunting()
 {
   walk_speed = 80;
   max_drop_height = 16;
 
   //Prevent stutter when Tux jumps on Mr Bomb
-  sound_manager->preload("sounds/explosion.wav");
+  SoundManager::current()->preload("sounds/explosion.wav");
 
   //Check if we need another sprite
   if( !reader.get( "sprite", sprite_name ) ){
@@ -51,20 +53,7 @@ Haywire::Haywire(const Reader& reader) :
     return;
   }
   //Replace sprite
-  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),
-  time_until_explosion(0.0f),
-  is_stunned(false),
-  time_stunned(0.0f)
-{
-  walk_speed = 80;
-  max_drop_height = 16;
-  sound_manager->preload("sounds/explosion.wav");
+  sprite = SpriteManager::current()->create( sprite_name );
 }
 
 HitResponse
@@ -95,6 +84,10 @@ Haywire::collision_squished(GameObject& object)
     return true;
   }
 
+  if(WalkingBadguy::is_frozen()) {
+    WalkingBadguy::unfreeze();
+  }
+
   if (!is_exploding) {
     set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1);
     walk_left_action = "ticking-left";
@@ -102,10 +95,23 @@ Haywire::collision_squished(GameObject& object)
     set_walk_speed (160);
     time_until_explosion = TIME_EXPLOSION;
     is_exploding = true;
+
+    ticking = SoundManager::current()->create_sound_source("sounds/fizz.wav");
+    ticking->set_position(get_pos());
+    ticking->set_looping(true);
+    ticking->set_reference_distance(32);
+    ticking->play();
+    grunting = SoundManager::current()->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);
@@ -117,6 +123,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;
@@ -137,42 +145,41 @@ Haywire::active_update(float elapsed_time)
     }
   }
 
-  if (is_exploding && !turn_around_timer.started()) {
+  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());
+    auto explosion = std::make_shared<Explosion>(get_bbox().get_middle());
     Sector::current()->add_object(explosion);
   }
 
   run_dead_script();
 }
 
-void
-Haywire::freeze()
-{
-  WalkingBadguy::freeze();
-  sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
-}
-
 bool
 Haywire::is_freezable() const
 {