Replaced Ref and RefCounter with std::shared_ptr<>
[supertux.git] / src / badguy / livefire.cpp
index b627c49..dd9c165 100644 (file)
 #include "supertux/object_factory.hpp"
 #include "supertux/sector.hpp"
 
-static const float WALKSPEED = 80;
-static const float MAXDROPHEIGHT = 20;
-
 LiveFire::LiveFire(const Reader& reader) :
   WalkingBadguy(reader, "images/creatures/livefire/livefire.sprite", "left", "right"),
-  lightsprite(sprite_manager->create("images/objects/lightmap_light/lightmap_light-medium.sprite")),
-  state(STATE_WALKING)  
+  lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-medium.sprite")),
+  death_sound("sounds/fall.wav"),
+  state(STATE_WALKING)
 {
-  walk_speed = WALKSPEED;
-  max_drop_height = MAXDROPHEIGHT;
+  walk_speed = 80;
+  max_drop_height = 20;
   lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
   lightsprite->set_color(Color(1.0f, 0.9f, 0.8f));
 }
@@ -68,7 +66,7 @@ LiveFire::active_update(float elapsed_time) {
     return;
   }
 
-  if(state == STATE_SLEEPING) {
+  if(state == STATE_SLEEPING && get_group() == COLGROUP_MOVING) {
 
     Player* player = this->get_nearest_player();
     if (player) {
@@ -86,19 +84,16 @@ LiveFire::active_update(float elapsed_time) {
         state = STATE_WAKING;
       }
     }
-
-    BadGuy::active_update(elapsed_time);
   }
-
-  if(state == STATE_WAKING) {
+  else if(state == STATE_WAKING) {
     if(sprite->animation_done()) {
       // start walking
       state = STATE_WALKING;
       WalkingBadguy::initialize();
     }
-
-    BadGuy::active_update(elapsed_time);
   }
+
+  BadGuy::active_update(elapsed_time);
 }
 
 void
@@ -117,6 +112,7 @@ void
 LiveFire::freeze()
 {
   // attempting to freeze a flame causes it to go out
+  death_sound = "sounds/sizzle.ogg";
   kill_fall();
 }
 
@@ -135,13 +131,15 @@ LiveFire::is_flammable() const
 void
 LiveFire::kill_fall()
 {
-  //TODO: get unique sound for ice-fire encounters
-  sound_manager->play("sounds/fall.wav", get_pos());
+  SoundManager::current()->play(death_sound, get_pos());
   // throw a puff of smoke
   Vector ppos = bbox.get_middle();
   Vector pspeed = Vector(0, -150);
   Vector paccel = Vector(0,0);
-  Sector::current()->add_object(new SpriteParticle("images/objects/particles/smoke.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_BACKGROUNDTILES+2));
+  Sector::current()->add_object(std::make_shared<SpriteParticle>("images/objects/particles/smoke.sprite",
+                                                                 "default", ppos, ANCHOR_MIDDLE,
+                                                                 pspeed, paccel,
+                                                                 LAYER_BACKGROUNDTILES+2));
   // extinguish the flame
   sprite->set_action(dir == LEFT ? "extinguish-left" : "extinguish-right", 1);
   physic.set_velocity_y(0);