Hello Markus, On Mon, 26 Jan 2015 02:46:56 +0100 Celelibi <celel...@gmail.com> wrote:
Apparently, right clicking when loosing the last ball cause a game over instead of simply loosing a life. It seems that this bug is easier to reproduce when the ball is falling vertically. At least I could get to reproduce it fairly easily by repeteadly right clicking while missing the ball falling straight.
This patch fixes Bug #776263. Best Regards, -- Bruno
--- include.original/sprite_ball.h 2014-09-30 12:20:25.000000000 +0200 +++ include/sprite_ball.h 2015-02-08 21:20:34.637125568 +0100 @@ -200,6 +200,7 @@ void set_on_ejector (Uint32 eject_id, Uint32 otime = 1); void disable_stick (); void accelerate (); + void move_sticked_paddle(sprite_paddle * paddle); virtual bool collision (sprite_object * sprite); private: --- src.orginal/sprite_ball.cc 2014-09-30 12:20:26.000000000 +0200 +++ src/sprite_ball.cc 2015-02-08 21:19:57.820625280 +0100 @@ -360,6 +360,48 @@ } } +/** Displacement of the balls sticked to the paddle + * */ +void +sprite_ball::move_sticked_paddle (sprite_paddle * paddle) +{ + Sint32 j; + switch (sticky_paddle_num) + { + case controller_paddles::BOTTOM_PADDLE: + j = (paddle->collision_width >> 1) - ((collision_width >> 1) + 1); + j += paddle->get_x_coord (); + x_coord = j; + j = (paddle->get_y_coord ()) - (collision_height + 1); + y_coord = j; + break; + + case controller_paddles::RIGHT_PADDLE: + j = (paddle->get_x_coord ()) - (collision_width - 1); + x_coord = j; + j = (paddle->collision_height >> 1) - ((collision_height >> 1) + 1); + j += paddle->get_y_coord (); + y_coord = j; + break; + + case controller_paddles::TOP_PADDLE: + j = (paddle->collision_width >> 1) - ((collision_width >> 1) + 1); + j += paddle->get_x_coord (); + x_coord = j; + j = (paddle->get_y_coord ()) + paddle->collision_height + 1; + y_coord = j; + break; + + case controller_paddles::LEFT_PADDLE: + j = (paddle->get_x_coord ()) + (paddle->collision_width) + 1; + x_coord = j; + j = (paddle->collision_height >> 1) - ((collision_height >> 1) + 1); + j += paddle->get_y_coord (); + y_coord = j; + break; + } +} + /** + * Check collision beetween a ball and another sprite. + * Override sprite_object::collision(sprite_object *). --- src.orginal/controller_balls.cc 2014-09-30 12:20:26.000000000 +0200 +++ src/controller_balls.cc 2015-02-08 21:26:04.897615300 +0100 @@ -232,6 +232,7 @@ num_of_sprites = 1; ball->paddle_touched->stick_ball (ball); ball->starts_again (ball->paddle_touched); + ball->move_sticked_paddle (paddle); head_anim->start_interference (); current_player->remove_life (1); ships->force_explosion (); @@ -409,49 +410,7 @@ } /* displacement of the balls sticked to the paddle */ - switch (ball->sticky_paddle_num) - { - case controller_paddles::BOTTOM_PADDLE: - j = (paddle->collision_width >> 1) - - ((ball->collision_width >> 1) + 1); - j += paddle->x_coord; - ball->x_coord = j; - j = (paddle->y_coord) - (ball->collision_height + 1); - ball->y_coord = j; - break; - - case controller_paddles::RIGHT_PADDLE: - j = (paddle->x_coord) - (ball->collision_width - 1); - ball->x_coord = j; - j = - (paddle->collision_height >> 1) - - ((ball->collision_height >> 1) + 1); - j += paddle->y_coord; - ball->y_coord = j; - break; - - case controller_paddles::TOP_PADDLE: - j = - (paddle->collision_width >> 1) - - ((ball->collision_width >> 1) + 1); - j += paddle->x_coord; - ball->x_coord = j; - j = (paddle->y_coord) + paddle->collision_height + 1; - ball->y_coord = j; - break; - - case controller_paddles::LEFT_PADDLE: - j = (paddle->x_coord) + (paddle->collision_width) + 1; - ball->x_coord = j; - j = - (paddle->collision_height >> 1) - - ((ball->collision_height >> 1) + 1); - j += paddle->y_coord; - ball->y_coord = j; - break; - - } - + ball->move_sticked_paddle (paddle); if (--ball->viewfinder_delay < 0) {