play sound when willowisp is caught
[supertux.git] / src / object / lantern.cpp
index e877a72..531ad95 100644 (file)
@@ -22,6 +22,8 @@
 #include "lantern.hpp"
 #include "sprite/sprite_manager.hpp"
 #include "object_factory.hpp"
+#include "badguy/willowisp.hpp"
+#include "badguy/treewillowisp.hpp"
 
 Lantern::Lantern(const lisp::Lisp& reader)
   : Rock(reader, "images/objects/lantern/lantern.sprite"),
@@ -34,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()
@@ -66,4 +69,56 @@ Lantern::draw(DrawingContext& context){
   context.pop_target();
 }
 
+HitResponse Lantern::collision(GameObject& other, const CollisionHit& hit) {
+  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();
+    }
+    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();
+    }
+  }
+  return Rock::collision(other, hit);
+}
+
+void
+Lantern::grab(MovingObject& object, const Vector& pos, Direction dir)
+{
+  Rock::grab(object, pos, dir);
+
+  // if lantern is not lit, draw it as opened
+  if (is_open()) {
+    sprite->set_action("off-open");
+  }
+
+}
+
+void
+Lantern::ungrab(MovingObject& object, Direction dir)
+{
+  // if lantern is not lit, it was drawn as opened while grabbed. Now draw it as closed again
+  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");
+