Major rewrite of scripting support:
[supertux.git] / src / object / powerup.cpp
index 1f338a6..f731822 100644 (file)
 #include <config.h>
 
 #include <math.h>
-#include "powerup.h"
-#include "resources.h"
-#include "player.h"
-#include "sprite/sprite_manager.h"
-#include "audio/sound_manager.h"
-#include "object_factory.h"
-#include "sector.h"
-#include "scripting/script_interpreter.h"
+#include "powerup.hpp"
+#include "resources.hpp"
+#include "player.hpp"
+#include "sprite/sprite_manager.hpp"
+#include "audio/sound_manager.hpp"
+#include "object_factory.hpp"
+#include "sector.hpp"
+#include "msg.hpp"
 
 PowerUp::PowerUp(const lisp::Lisp& lisp)
 {
-  std::string sprite_name;
   lisp.get("x", bbox.p1.x);
   lisp.get("y", bbox.p1.y);
   lisp.get("sprite", sprite_name);
   lisp.get("script", script);
+  no_physics = false;
+  lisp.get("disable-physics", no_physics);
   bbox.set_size(32, 32);   
   sprite = sprite_manager->create(sprite_name);
   physic.enable_gravity(true);
+
+  set_group(COLGROUP_MOVING);
 }
 
 PowerUp::~PowerUp()
@@ -66,21 +69,21 @@ PowerUp::collision(GameObject& other, const CollisionHit& hit)
   remove_me();
 
   if (script != "") {
-    ScriptInterpreter::add_script_object(Sector::current(), "powerup-script",
-        script);
+    std::istringstream stream(script);
+    Sector::current()->run_script(stream, "powerup-script");
     return ABORT_MOVE;
   }
-  
+
   // some defaults if no script has been set
-  if (sprite->get_name() == "egg") {
+  if (sprite_name == "images/powerups/egg/egg.sprite") {
     player->set_bonus(GROWUP_BONUS, true);
-    sound_manager->play("grow");
-  } else if (sprite->get_name() == "fireflower") {
+    sound_manager->play("sounds/grow.wav");
+  } else if (sprite_name == "images/powerups/fireflower/fireflower.sprite") {
     player->set_bonus(FIRE_BONUS, true);
-    sound_manager->play("fire-flower");
-  } else if (sprite->get_name() == "star") {
+    sound_manager->play("sounds/fire-flower.wav");
+  } else if (sprite_name == "images/powerups/star/star.sprite") {
     player->make_invincible();
-  } else if (sprite->get_name() == "1up") {
+  } else if (sprite_name == "images/powerups/1up/1up.sprite") {
     player->get_status()->incLives();
   }
   return ABORT_MOVE;
@@ -89,7 +92,8 @@ PowerUp::collision(GameObject& other, const CollisionHit& hit)
 void
 PowerUp::update(float elapsed_time)
 {
-  movement = physic.get_movement(elapsed_time);
+  if (!no_physics)
+    movement = physic.get_movement(elapsed_time);
 }
 
 void