#include "object/sprite_particle.hpp"
#include "trigger/climbable.hpp"
+//#define SWIMMING
+
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150f;
/// time before idle animation starts
}
void
-TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer)
+TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer, Portable* grabbed_object)
{
if(head != NULL)
- head->draw(context, pos, layer-1);
+ head->draw(context, pos, layer-2);
if(body != NULL)
- body->draw(context, pos, layer-3);
+ body->draw(context, pos, layer-4);
if(arms != NULL)
- arms->draw(context, pos, layer+10);
+ arms->draw(context, pos, layer-1 + (grabbed_object?10:0));
if(feet != NULL)
- feet->draw(context, pos, layer-2);
+ feet->draw(context, pos, layer-3);
}
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");
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();
}
delete smalltux_gameover;
delete smalltux_star;
delete bigtux_star;
+ delete scripting_controller;
}
void
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)
{
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);
// swimming
physic.set_acceleration_y(0);
+#ifdef SWIMMING
if (swimming) {
if (controller->hold(Controller::UP) || controller->hold(Controller::JUMP))
physic.set_acceleration_y(-2000);
physic.set_velocity_y(physic.get_velocity_y() * 0.94);
}
+#endif
}
void
if( controller->released( Controller::PEEK_RIGHT ) ) {
peeking = AUTO;
}
+ if( controller->released( Controller::UP ) ) {
+ peeking = AUTO;
+ }
+ if( controller->released( Controller::DOWN ) ) {
+ peeking = AUTO;
+ }
if( controller->pressed( Controller::PEEK_LEFT ) ) {
peeking = LEFT;
}
if( controller->pressed( Controller::PEEK_RIGHT ) ) {
peeking = RIGHT;
}
+ if( controller->pressed( Controller::UP ) ) {
+ peeking = UP;
+ }
+ if( controller->pressed( Controller::DOWN ) ) {
+ peeking = DOWN;
+ }
/* Handle horizontal movement: */
if (!backflipping) handle_horizontal_input();
if(moving_object) {
moving_object->set_pos(pos);
} else {
- log_debug << "Non MovingObjetc grabbed?!?" << std::endl;
+ log_debug << "Non MovingObject grabbed?!?" << std::endl;
+ }
+ if(controller->hold(Controller::UP)) {
+ grabbed_object->ungrab(*this, UP);
+ } else {
+ grabbed_object->ungrab(*this, dir);
}
- grabbed_object->ungrab(*this, dir);
grabbed_object = NULL;
}
}
else if (safe_timer.started() && size_t(game_time*40)%2)
; // don't draw Tux
else
- tux_body->draw(context, get_pos(), layer);
+ tux_body->draw(context, get_pos(), layer, grabbed_object);
}
if(tile_attributes & Tile::HURTS)
kill(false);
+#ifdef SWIMMING
if( swimming ){
if( tile_attributes & Tile::WATER ){
no_water = false;
sound_manager->play( "sounds/splash.ogg" );
}
}
+#endif
}
void
return;
sound_manager->play("sounds/hurt.wav");
+
if (climbing) stop_climbing(*climbing);
physic.set_velocity_x(0);
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++)
}
/* 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;
}
}
+void
+Player::set_edit_mode(bool enable)
+{
+ edit_mode = enable;
+}
+
void
Player::start_climbing(Climbable& climbable)
{