X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=b5857c902dfa77657f5c9ed69ea1b5ad0c051d1a;hb=8d033f0cbe51f8cf71898a6a4f2e77dcc32e3857;hp=d523bdaff17ba538b3268e1985de4f4932ea7aa6;hpb=6074972382238a94397b649650738daf0d869775;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index d523bdaff..b5857c902 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -407,43 +407,47 @@ GameSession::process_events() } } - void GameSession::check_end_conditions() { Player* tux = world->get_tux(); /* End of level? */ - if (tux->base.x >= World::current()->get_level()->endpos + 32 * (get_level()->use_endsequence ? 22 : 10)) + int endpos = (World::current()->get_level()->width-5) * 32; + Tile* endtile = collision_goal(tux->base); + + // fallback in case the other endpositions don't trigger + if (tux->base.x >= endpos || (endtile && endtile->data >= 1) + || (end_sequence && !endsequence_timer.check())) { exit_status = LEVEL_FINISHED; + return; } - else if (tux->base.x >= World::current()->get_level()->endpos && !end_sequence) + else if(!end_sequence && endtile && endtile->data == 0) { end_sequence = true; last_x_pos = -1; music_manager->halt_music(); + endsequence_timer.start(5000); // 5 seconds until we finish the map } - else + else if (!end_sequence && tux->is_dead()) { - // Check End conditions - if (tux->is_dead()) - { - player_status.lives -= 1; - - if (player_status.lives < 0) - { // No more lives!? - if(st_gl_mode != ST_GL_TEST) - drawendscreen(); - - exit_status = GAME_OVER; - } - else - { // Still has lives, so reset Tux to the levelstart - restart_level(); - } + player_status.lives -= 1; + + if (player_status.lives < 0) + { // No more lives!? + if(st_gl_mode != ST_GL_TEST) + drawendscreen(); + + exit_status = GAME_OVER; + } + else + { // Still has lives, so reset Tux to the levelstart + restart_level(); } - } + + return; + } } void @@ -610,8 +614,7 @@ GameSession::run() world->play_music(HERRING_MUSIC); } /* are we low on time ? */ - else if (time_left.get_left() < TIME_WARNING - && (world->get_music_type() == LEVEL_MUSIC)) + else if (time_left.get_left() < TIME_WARNING) { world->play_music(HURRYUP_MUSIC); } @@ -662,12 +665,13 @@ GameSession::drawstatus() white_text->draw("Press ESC To Return",0,20,1); } - if (time_left.get_left() > TIME_WARNING || (global_frame_counter % 10) < 5) - { - sprintf(str, "%d", time_left.get_left() / 1000 ); - white_text->draw("TIME", 224, 0, 1); - gold_text->draw(str, 304, 0, 1); - } + if(!time_left.check()) { + white_text->draw("TIME'S UP", 224, 0, 1); + } else if (time_left.get_left() > TIME_WARNING || (global_frame_counter % 10) < 5) { + sprintf(str, "%d", time_left.get_left() / 1000 ); + white_text->draw("TIME", 224, 0, 1); + gold_text->draw(str, 304, 0, 1); + } sprintf(str, "%d", player_status.distros); white_text->draw("COINS", screen->h, 0, 1);