* Add Airship (regular above-ground theme) and Battle (castle/boss theme) music court...
[supertux.git] / src / badguy / angrystone.cpp
index d6dd326..cd74332 100644 (file)
 
 #include "angrystone.hpp"
 
+#include "lisp/writer.hpp"
+#include "object/player.hpp"
+#include "object_factory.hpp"
+#include "sprite/sprite.hpp"
+
 static const float SPEED = 240;
 
 static const float CHARGE_TIME = .5;
@@ -29,8 +34,12 @@ static const float ATTACK_TIME = 1;
 static const float RECOVER_TIME = .5;
 
 AngryStone::AngryStone(const lisp::Lisp& reader)
-       : BadGuy(reader, "images/creatures/angrystone/angrystone.sprite"), state(IDLE)
+        : BadGuy(reader, "images/creatures/angrystone/angrystone.sprite"), state(IDLE)
 {
+  physic.set_velocity_x(0);
+  physic.set_velocity_y(0);
+  physic.enable_gravity(true);
+  sprite->set_action("idle");
 }
 
 void
@@ -38,22 +47,13 @@ AngryStone::write(lisp::Writer& writer)
 {
   writer.start_list("angrystone");
 
-  writer.write_float("x", start_position.x);
-  writer.write_float("y", start_position.y);
+  writer.write("x", start_position.x);
+  writer.write("y", start_position.y);
 
   writer.end_list("angrystone");
 }
 
 void
-AngryStone::activate()
-{
-  physic.set_velocity_x(0);
-  physic.set_velocity_y(0);
-  physic.enable_gravity(true);
-  sprite->set_action("idle");
-}
-
-void
 AngryStone::collision_solid(const CollisionHit& hit)
 {
   // TODO
@@ -95,47 +95,49 @@ AngryStone::active_update(float elapsed_time) {
 
   if (state == IDLE) {
     MovingObject* player = this->get_nearest_player();
-    MovingObject* badguy = this;
-    const Vector playerPos = player->get_pos();
-    const Vector badguyPos = badguy->get_pos();
-    float dx = (playerPos.x - badguyPos.x);
-    float dy = (playerPos.y - badguyPos.y);
-
-    float playerHeight = player->get_bbox().p2.y - player->get_bbox().p1.y;
-    float badguyHeight = badguy->get_bbox().p2.y - badguy->get_bbox().p1.y;
-
-    float playerWidth = player->get_bbox().p2.x - player->get_bbox().p1.x;
-    float badguyWidth = badguy->get_bbox().p2.x - badguy->get_bbox().p1.x;
-
-    if ((dx > -playerWidth) && (dx < badguyWidth)) {
-      if (dy > 0) {
-        attackDirection.x = 0;
-        attackDirection.y = 1;
-      } else {
-        attackDirection.x = 0;
-        attackDirection.y = -1;
-      }
-      if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
-        sprite->set_action("charging");
-        timer.start(CHARGE_TIME);
-        state = CHARGING;
+    if(player) {
+      MovingObject* badguy = this;
+      const Vector playerPos = player->get_pos();
+      const Vector badguyPos = badguy->get_pos();
+      float dx = (playerPos.x - badguyPos.x);
+      float dy = (playerPos.y - badguyPos.y);
+
+      float playerHeight = player->get_bbox().p2.y - player->get_bbox().p1.y;
+      float badguyHeight = badguy->get_bbox().p2.y - badguy->get_bbox().p1.y;
+
+      float playerWidth = player->get_bbox().p2.x - player->get_bbox().p1.x;
+      float badguyWidth = badguy->get_bbox().p2.x - badguy->get_bbox().p1.x;
+
+      if ((dx > -playerWidth) && (dx < badguyWidth)) {
+        if (dy > 0) {
+          attackDirection.x = 0;
+          attackDirection.y = 1;
+        } else {
+          attackDirection.x = 0;
+          attackDirection.y = -1;
+        }
+        if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
+          sprite->set_action("charging");
+          timer.start(CHARGE_TIME);
+          state = CHARGING;
+        }
+      } else
+      if ((dy > -playerHeight) && (dy < badguyHeight)) {
+        if (dx > 0) {
+          attackDirection.x = 1;
+          attackDirection.y = 0;
+        } else {
+          attackDirection.x = -1;
+          attackDirection.y = 0;
+        }
+        if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
+          sprite->set_action("charging");
+          timer.start(CHARGE_TIME);
+          state = CHARGING;
+        }
       }
-    } else
-    if ((dy > -playerHeight) && (dy < badguyHeight)) {
-      if (dx > 0) {
-        attackDirection.x = 1;
-        attackDirection.y = 0;
-      } else {
-        attackDirection.x = -1;
-        attackDirection.y = 0;
-      }
-      if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
-        sprite->set_action("charging");
-        timer.start(CHARGE_TIME);
-        state = CHARGING;
-      }
-    }
 
+    }
   }
 
   if (state == CHARGING) {