(Tree)WillOWisps no longer collide with closed lamps.
authorChristoph Sommer <mail@christoph-sommer.de>
Sat, 26 May 2007 15:36:06 +0000 (15:36 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Sat, 26 May 2007 15:36:06 +0000 (15:36 +0000)
TreeWillOWisps now hurt Tux.

SVN-Revision: 5024

src/badguy/treewillowisp.cpp
src/badguy/treewillowisp.hpp
src/badguy/willowisp.cpp
src/badguy/willowisp.hpp
src/object/lantern.cpp
src/object/lantern.hpp

index c31531f..9ec0897 100644 (file)
@@ -63,15 +63,15 @@ TreeWillOWisp::vanish()
 HitResponse
 TreeWillOWisp::collision_player(Player& player, const CollisionHit& hit)
 {
-  (void) player;
-  (void) hit;
-
-  return FORCE_MOVE;
+  //TODO: basically a no-op. Remove if this doesn't change.
+  return BadGuy::collision_player(player, hit);
 }
 
 bool
 TreeWillOWisp::collides(GameObject& other, const CollisionHit& ) {
-  if (dynamic_cast<Lantern*>(&other)) return true;
+  Lantern* lantern = dynamic_cast<Lantern*>(&other);
+  if (lantern && lantern->is_open()) return true;
+  if (dynamic_cast<Player*>(&other)) return true;
   return false;
 }
 
index b57dcc7..49b8d07 100644 (file)
@@ -40,6 +40,10 @@ public:
   void set_color(const Color& color);
   Color get_color() const;
 
+  virtual bool is_flammable() const { return false; }
+  virtual bool is_freezable() const { return false; }
+  virtual void kill_fall() { vanish(); }
+
 protected:
   virtual bool collides(GameObject& other, const CollisionHit& hit);
   HitResponse collision_player(Player& player, const CollisionHit& hit);
index 657bed8..a4fecd8 100644 (file)
@@ -139,11 +139,6 @@ WillOWisp::deactivate()
 }
 
 void
-WillOWisp::kill_fall()
-{
-}
-
-void
 WillOWisp::vanish()
 {
   mystate = STATE_VANISHING;
@@ -153,7 +148,8 @@ WillOWisp::vanish()
 
 bool
 WillOWisp::collides(GameObject& other, const CollisionHit& ) {
-  if (dynamic_cast<Lantern*>(&other)) return true;
+  Lantern* lantern = dynamic_cast<Lantern*>(&other);
+  if (lantern && lantern->is_open()) return true;
   if (dynamic_cast<Player*>(&other)) return true;
   return false;
 }
index 78ea5c7..c21933d 100644 (file)
@@ -33,7 +33,9 @@ public:
 
   void write(lisp::Writer& write);
   void active_update(float elapsed_time);
-  void kill_fall();
+  virtual bool is_flammable() const { return false; }
+  virtual bool is_freezable() const { return false; }
+  virtual void kill_fall() { vanish(); }
 
   /**
    * make WillOWisp vanish
index a91b15f..605983e 100644 (file)
@@ -69,7 +69,7 @@ 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
@@ -94,7 +94,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 +103,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");
index f991105..a41e386 100644 (file)
@@ -38,6 +38,11 @@ public:
   void grab(MovingObject& object, const Vector& pos, Direction dir);
   void ungrab(MovingObject& object, Direction dir);
 
+  /**
+   * returns true if lamp is currently open
+   */
+  bool is_open();
+
 private:
   Color lightcolor;
   Sprite* lightsprite;