play sound when willowisp is caught
[supertux.git] / src / object / lantern.cpp
index a91b15f..531ad95 100644 (file)
@@ -36,6 +36,7 @@ Lantern::Lantern(const lisp::Lisp& reader)
   lightsprite = sprite_manager->create("images/objects/lightmap_light/lightmap_light.sprite");
   lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
   updateColor();
+  sound_manager->preload("sounds/willocatch.wav");
 }
 
 Lantern::~Lantern()
@@ -69,10 +70,11 @@ Lantern::draw(DrawingContext& context){
 }
 
 HitResponse Lantern::collision(GameObject& other, const CollisionHit& hit) {
-  if ((grabbed) && lightcolor.red == 0 && lightcolor.green == 0 && lightcolor.blue == 0){
+  if (is_open()) {
     WillOWisp* wow = dynamic_cast<WillOWisp*>(&other);
     if (wow) {
       // collided with WillOWisp while grabbed and unlit
+      sound_manager->play("sounds/willocatch.wav");
       lightcolor = Color(0,1,0);
       updateColor();
       wow->vanish();
@@ -80,6 +82,7 @@ HitResponse Lantern::collision(GameObject& other, const CollisionHit& hit) {
     TreeWillOWisp* twow = dynamic_cast<TreeWillOWisp*>(&other);
     if (twow) {
       // collided with TreeWillOWisp while grabbed and unlit
+      sound_manager->play("sounds/willocatch.wav");
       lightcolor = twow->get_color();
       updateColor();
       twow->vanish();
@@ -94,7 +97,7 @@ Lantern::grab(MovingObject& object, const Vector& pos, Direction dir)
   Rock::grab(object, pos, dir);
 
   // if lantern is not lit, draw it as opened
-  if(lightcolor.red == 0 && lightcolor.green == 0 && lightcolor.blue == 0){
+  if (is_open()) {
     sprite->set_action("off-open");
   }
 
@@ -103,12 +106,18 @@ Lantern::grab(MovingObject& object, const Vector& pos, Direction dir)
 void
 Lantern::ungrab(MovingObject& object, Direction dir)
 {
-  Rock::ungrab(object, dir);
-
   // if lantern is not lit, it was drawn as opened while grabbed. Now draw it as closed again
-  if(lightcolor.red == 0 && lightcolor.green == 0 && lightcolor.blue == 0){
+  if (is_open()) {
     sprite->set_action("off");
   }
+
+  Rock::ungrab(object, dir);
+}
+  
+bool 
+Lantern::is_open()
+{
+  return ((grabbed) && lightcolor.red == 0 && lightcolor.green == 0 && lightcolor.blue == 0);
 }
 
 IMPLEMENT_FACTORY(Lantern, "lantern");