+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);
+}
+