Powerup: Iceflower improvements
[supertux.git] / src / badguy / haywire.cpp
index 293aa3f..b968de5 100644 (file)
@@ -54,19 +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),
-  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");
-}
-
 HitResponse
 Haywire::collision(GameObject& object, const CollisionHit& hit)
 {
@@ -94,6 +81,10 @@ Haywire::collision_squished(GameObject& object)
       player->bounce (*this);
     return true;
   }
+  
+  if(WalkingBadguy::is_frozen()) {
+    WalkingBadguy::unfreeze();
+  }
 
   if (!is_exploding) {
     set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1);
@@ -102,6 +93,17 @@ 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;
@@ -119,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;
@@ -161,6 +165,10 @@ Haywire::active_update(float 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());
@@ -170,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
 {