X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.cpp;h=5e68d1d58d3702cbec8efc25b6ec790b6ff995f5;hb=bf50931d8b9cdf1b9c0215832c9b2bd3ce452d49;hp=5b965a29064661f1e190226d71db09e7fb1d3851;hpb=fea3446f05e1e7673607b835c269d3e8d1929ab3;p=supertux.git diff --git a/src/object/player.cpp b/src/object/player.cpp index 5b965a290..5e68d1d58 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -54,6 +54,7 @@ //#define SWIMMING static const int TILES_FOR_BUTTJUMP = 3; +static const float BUTTJUMP_MIN_VELOCITY_Y = 700.0f; static const float SHOOTING_TIME = .150f; /// time before idle animation starts static const float IDLE_TIME = 2.5f; @@ -86,54 +87,20 @@ static const float CHEER_TIME = 1.0f; /** if Tux cannot unduck for this long, he will get hurt */ static const float UNDUCK_HURT_TIME = 0.25f; -// growing animation -Surface* growingtux_left[GROWING_FRAMES]; -Surface* growingtux_right[GROWING_FRAMES]; - -Surface* tux_life = 0; - -TuxBodyParts* small_tux = 0; -TuxBodyParts* big_tux = 0; -TuxBodyParts* fire_tux = 0; -TuxBodyParts* ice_tux = 0; - namespace{ bool no_water = true; } -void -TuxBodyParts::set_action(std::string action, int loops) -{ - if(head != NULL) - head->set_action(action, loops); - if(body != NULL) - body->set_action(action, loops); - if(arms != NULL) - arms->set_action(action, loops); - if(feet != NULL) - feet->set_action(action, loops); -} - -void -TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer, Portable* grabbed_object) -{ - if(head != NULL) - head->draw(context, pos, layer-2); - if(body != NULL) - body->draw(context, pos, layer-4); - if(arms != NULL) - arms->draw(context, pos, layer-1 + (grabbed_object?10:0)); - if(feet != NULL) - 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; - 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"); + scripting_controller = new CodeController(); + sprite = sprite_manager->create("images/creatures/tux/tux.sprite"); airarrow.reset(new Surface("images/engine/hud/airarrow.png")); sound_manager->preload("sounds/bigjump.wav"); @@ -143,6 +110,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(); } @@ -150,9 +118,8 @@ Player::Player(PlayerStatus* _player_status, const std::string& name) Player::~Player() { if (climbing) stop_climbing(*climbing); - delete smalltux_gameover; - delete smalltux_star; - delete bigtux_star; + delete sprite; + delete scripting_controller; } void @@ -175,6 +142,7 @@ Player::init() jumping = false; can_jump = true; butt_jump = false; + growing = false; deactivated = false; backflipping = false; backflip_direction = 0; @@ -226,6 +194,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) { @@ -361,6 +352,10 @@ Player::update(float elapsed_time) } } + if (growing) { + if (sprite->animation_done()) growing = false; + } + } bool @@ -501,9 +496,12 @@ Player::do_duck() { return; if (!on_ground()) return; + if (butt_jump) + return; if (adjust_height(31.8f)) { duck = true; + growing = false; unduck_hurt_timer.stop(); } else { // FIXME: what now? @@ -590,7 +588,7 @@ Player::handle_vertical_input() /* In case the player has pressed Down while in a certain range of air, enable butt jump action */ - if (controller->hold(Controller::DOWN) && !butt_jump && !duck && is_big() && jumping) { + if (controller->hold(Controller::DOWN) && !butt_jump && !duck && is_big() && !on_ground() && (physic.get_velocity_y() >= BUTTJUMP_MIN_VELOCITY_Y)) { butt_jump = true; } @@ -827,11 +825,17 @@ Player::set_bonus(BonusType type, bool animate) printf("can't adjust\n"); return false; } - if(animate) - growing_timer.start(GROWING_TIME); + if(animate) { + growing = true; + sprite->set_action((dir == LEFT)?"grow-left":"grow-right", 1); + } if (climbing) stop_climbing(*climbing); } + if (type == NO_BONUS) { + if (butt_jump) butt_jump = false; + } + if ((type == NO_BONUS) || (type == GROWUP_BONUS)) { if ((player_status->bonus == FIRE_BONUS) && (animate)) { // visually lose helmet @@ -897,133 +901,77 @@ Player::draw(DrawingContext& context) context.draw_surface(airarrow.get(), Vector(px, py), LAYER_HUD - 1); } - TuxBodyParts* tux_body; - + std::string sa_prefix = ""; if (player_status->bonus == GROWUP_BONUS) - tux_body = big_tux; + sa_prefix = "big"; else if (player_status->bonus == FIRE_BONUS) - tux_body = fire_tux; + sa_prefix = "fire"; else if (player_status->bonus == ICE_BONUS) - tux_body = ice_tux; + sa_prefix = "ice"; else - tux_body = small_tux; - - int layer = LAYER_OBJECTS + 1; + sa_prefix = "small"; /* Set Tux sprite action */ - if (climbing) - { - tux_body->set_action("skid-left"); - } - else if (backflipping) - { - if(dir == LEFT) - tux_body->set_action("backflip-left"); - else // dir == RIGHT - tux_body->set_action("backflip-right"); - } - else if (duck && is_big()) - { - if(dir == LEFT) - tux_body->set_action("duck-left"); - else // dir == RIGHT - tux_body->set_action("duck-right"); - } - else if (skidding_timer.started() && !skidding_timer.check()) - { - if(dir == LEFT) - tux_body->set_action("skid-left"); - else // dir == RIGHT - tux_body->set_action("skid-right"); - } - else if (kick_timer.started() && !kick_timer.check()) - { - if(dir == LEFT) - tux_body->set_action("kick-left"); - else // dir == RIGHT - tux_body->set_action("kick-right"); - } - else if (butt_jump && is_big()) - { - if(dir == LEFT) - tux_body->set_action("buttjump-left"); - else // dir == RIGHT - tux_body->set_action("buttjump-right"); - } - else if (!on_ground()) - { - if(dir == LEFT) - tux_body->set_action("jump-left"); - else // dir == RIGHT - tux_body->set_action("jump-right"); + if (growing) { + // while growing, do not change action + // do_duck() will take care of cancelling growing manually + // update() will take care of cancelling when growing completed + } + else if (climbing) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-skid-left":"-skid-right")); + } + else if (backflipping) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-backflip-left":"-backflip-right")); + } + else if (duck && is_big()) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-duck-left":"-duck-right")); + } + else if (skidding_timer.started() && !skidding_timer.check()) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-skid-left":"-skid-right")); + } + else if (kick_timer.started() && !kick_timer.check()) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-kick-left":"-kick-right")); + } + else if (butt_jump && is_big()) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-buttjump-left":"-buttjump-right")); + } + else if (!on_ground()) { + sprite->set_action(sa_prefix+((dir == LEFT)?"-jump-left":"-jump-right")); + } + else { + if (fabsf(physic.get_velocity_x()) < 1.0f) { +// if(idle_timer.check()) { +// sprite->set_action(sa_prefix+((dir == LEFT)?"-idle-left":"-idle-right")); +// } else { + sprite->set_action(sa_prefix+((dir == LEFT)?"-stand-left":"-stand-right")); +// } } - else - { - if (fabsf(physic.get_velocity_x()) < 1.0f) // standing - { - if(dir == LEFT) - tux_body->set_action("stand-left"); - else // dir == RIGHT - tux_body->set_action("stand-right"); - } - else // moving - { - if(dir == LEFT) - tux_body->set_action("walk-left"); - else // dir == RIGHT - tux_body->set_action("walk-right"); - } + else { + sprite->set_action(sa_prefix+((dir == LEFT)?"-walk-left":"-walk-right")); } + } - if(idle_timer.check()) - { - if(is_big()) - { - if(dir == LEFT) - tux_body->head->set_action("idle-left", 1); - else // dir == RIGHT - tux_body->head->set_action("idle-right", 1); - } - - } +/* // Tux is holding something if ((grabbed_object != 0 && physic.get_velocity_y() == 0) || - (shooting_timer.get_timeleft() > 0 && !shooting_timer.check())) - { - if (duck) - { - if(dir == LEFT) - tux_body->arms->set_action("duck+grab-left"); - else // dir == RIGHT - tux_body->arms->set_action("duck+grab-right"); - } - else - { - if(dir == LEFT) - tux_body->arms->set_action("grab-left"); - else // dir == RIGHT - tux_body->arms->set_action("grab-right"); - } + (shooting_timer.get_timeleft() > 0 && !shooting_timer.check())) { + if (duck) { + } else { } + } +*/ - /* Draw Tux */ if(dying) { - smalltux_gameover->draw(context, get_pos(), LAYER_FLOATINGOBJECTS + 1); + sprite->set_action("gameover"); } - else if ((growing_timer.get_timeleft() > 0) && (!duck)) { - if (dir == RIGHT) { - context.draw_surface(growingtux_right[int((growing_timer.get_timegone() * - GROWING_FRAMES) / GROWING_TIME)], get_pos(), layer); - } else { - context.draw_surface(growingtux_left[int((growing_timer.get_timegone() * - GROWING_FRAMES) / GROWING_TIME)], get_pos(), layer); - } - } - else if (safe_timer.started() && size_t(game_time*40)%2) + + /* Draw Tux */ + if (safe_timer.started() && size_t(game_time*40)%2) ; // don't draw Tux - else - tux_body->draw(context, get_pos(), layer, grabbed_object); + else { + sprite->draw(context, get_pos(), LAYER_OBJECTS + 1); + } } @@ -1059,6 +1007,24 @@ Player::collision_solid(const CollisionHit& hit) on_ground_flag = true; floor_normal = hit.slope_normal; + + // Butt Jump landed + if (butt_jump) { + butt_jump = false; + physic.set_velocity_y(-300); + on_ground_flag = false; + Sector::current()->add_object(new Particles( + Vector(get_bbox().p2.x, get_bbox().p2.y), + 270+20, 270+40, + Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, + LAYER_OBJECTS+1)); + Sector::current()->add_object(new Particles( + Vector(get_bbox().p1.x, get_bbox().p2.y), + 90-40, 90-20, + Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, + LAYER_OBJECTS+1)); + } + } else if(hit.top) { if(physic.get_velocity_y() < 0) physic.set_velocity_y(.2f); @@ -1133,28 +1099,34 @@ Player::kill(bool completely) return; sound_manager->play("sounds/hurt.wav"); + if (climbing) stop_climbing(*climbing); physic.set_velocity_x(0); - if(!completely && (is_big() || growing_timer.started())) { + if(!completely && is_big()) { if(player_status->bonus == FIRE_BONUS || player_status->bonus == ICE_BONUS) { safe_timer.start(TUX_SAFE_TIME); set_bonus(GROWUP_BONUS, true); } else if(player_status->bonus == GROWUP_BONUS) { - //growing_timer.start(GROWING_TIME); safe_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */); adjust_height(30.8f); duck = false; set_bonus(NO_BONUS, true); } else if(player_status->bonus == NO_BONUS) { - growing_timer.stop(); safe_timer.start(TUX_SAFE_TIME); adjust_height(30.8f); 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++) @@ -1213,7 +1185,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; } @@ -1308,6 +1280,12 @@ Player::set_ghost_mode(bool enable) } +void +Player::set_edit_mode(bool enable) +{ + edit_mode = enable; +} + void Player::start_climbing(Climbable& climbable) {