remove jam buildfiles, we're using cmake now and I don't want to maintain 2 buildsystems
[supertux.git] / src / object / player.cpp
index b332cae..978e073 100644 (file)
@@ -51,7 +51,7 @@
 #include "object/sprite_particle.hpp"
 #include "trigger/climbable.hpp"
 
-//#define DO_SWIMMING
+//#define SWIMMING
 
 static const int TILES_FOR_BUTTJUMP = 3;
 static const float SHOOTING_TIME = .150f;
@@ -127,10 +127,14 @@ TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer, Portab
 }
 
 Player::Player(PlayerStatus* _player_status, const std::string& name)
-  : player_status(_player_status), grabbed_object(NULL), ghost_mode(false), climbing(0)
+  : scripting_controller(0), 
+    player_status(_player_status), 
+    scripting_controller_old(0),
+    grabbed_object(NULL), ghost_mode(false), edit_mode(false), climbing(0)
 {
   this->name = name;
   controller = main_controller;
+  scripting_controller = new CodeController();
   smalltux_gameover = sprite_manager->create("images/creatures/tux_small/smalltux-gameover.sprite");
   smalltux_star = sprite_manager->create("images/creatures/tux_small/smalltux-star.sprite");
   bigtux_star = sprite_manager->create("images/creatures/tux_big/bigtux-star.sprite");
@@ -143,6 +147,7 @@ Player::Player(PlayerStatus* _player_status, const std::string& name)
   sound_manager->preload("sounds/flip.wav");
   sound_manager->preload("sounds/invincible.wav");
   sound_manager->preload("sounds/splash.ogg");
+  sound_manager->preload("sounds/shoot.wav");
 
   init();
 }
@@ -153,6 +158,7 @@ Player::~Player()
   delete smalltux_gameover;
   delete smalltux_star;
   delete bigtux_star;
+  delete scripting_controller;
 }
 
 void
@@ -226,6 +232,29 @@ Player::set_controller(Controller* controller)
   this->controller = controller;
 }
 
+void 
+Player::use_scripting_controller(bool use_or_release)
+{
+  if ((use_or_release == true) && (controller != scripting_controller)) {
+    scripting_controller_old = get_controller();
+    set_controller(scripting_controller);
+  }
+  if ((use_or_release == false) && (controller == scripting_controller)) {
+    set_controller(scripting_controller_old);
+    scripting_controller_old = 0;
+  }
+}
+
+void 
+Player::do_scripting_controller(std::string control, bool pressed)
+{
+  for(int i = 0; Controller::controlNames[i] != 0; ++i) {
+    if(control == std::string(Controller::controlNames[i])) {
+      scripting_controller->press(Controller::Control(i), pressed);
+    }
+  }
+}
+
 bool
 Player::adjust_height(float new_height)
 {
@@ -541,9 +570,6 @@ Player::do_backflip() {
   if (!on_ground())
     return;
 
-  // TODO: we don't have an animation for firetux backflipping, so let's revert to bigtux
-  set_bonus(GROWUP_BONUS, true);
-
   backflip_direction = (dir == LEFT)?(+1):(-1);
   backflipping = true;
   do_jump(-580);
@@ -1136,6 +1162,7 @@ Player::kill(bool completely)
     return;
 
   sound_manager->play("sounds/hurt.wav");
+
   if (climbing) stop_climbing(*climbing);
 
   physic.set_velocity_x(0);
@@ -1158,6 +1185,13 @@ Player::kill(bool completely)
       duck = false;
     }
   } else {
+
+    // do not die when in edit mode
+    if (edit_mode) {
+      set_ghost_mode(true);
+      return;
+    }
+
     if (player_status->coins >= 25 && !GameSession::current()->get_reset_point_sectorname().empty())
     {
       for (int i = 0; i < 5; i++)
@@ -1216,7 +1250,7 @@ Player::check_bounds(Camera* camera)
   }
 
   /* fallen out of the level? */
-  if (get_pos().y > Sector::current()->get_height()) {
+  if ((get_pos().y > Sector::current()->get_height()) && (!ghost_mode)) {
     kill(true);
     return;
   }
@@ -1311,6 +1345,12 @@ Player::set_ghost_mode(bool enable)
 }
 
 
+void
+Player::set_edit_mode(bool enable)
+{
+  edit_mode = enable;
+}
+
 void 
 Player::start_climbing(Climbable& climbable)
 {