X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=b5857c902dfa77657f5c9ed69ea1b5ad0c051d1a;hb=8d033f0cbe51f8cf71898a6a4f2e77dcc32e3857;hp=45da68bf11943671bab09c99ccca37fc6fef599a;hpb=ac0d0cbed75bb244d3377c6ff04552d989c1809c;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 45da68bf1..b5857c902 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -157,7 +157,7 @@ GameSession::levelintro(void) white_text->drawf(str, 0, 224, A_HMIDDLE, A_TOP, 1); sprintf(str, "by %s", world->get_level()->author.c_str()); - white_small_text->drawf(str, 0, 400, A_HMIDDLE, A_TOP, 1); + white_small_text->drawf(str, 0, 360, A_HMIDDLE, A_TOP, 1); flipscreen(); @@ -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 @@ -527,8 +531,8 @@ GameSession::run() update_time = last_update_time = st_get_ticks(); /* Clear screen: */ - clearscreen(0, 0, 0); - updatescreen(); +// clearscreen(0, 0, 0); +// updatescreen(); // Eat unneeded events SDL_Event event; @@ -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); @@ -750,9 +754,12 @@ std::string slotinfo(int slot) sprintf(slotfile,"%s/slot%d.stsg",st_save_dir,slot); lisp_object_t* savegame = lisp_read_from_file(slotfile); - LispReader reader(lisp_cdr(savegame)); - reader.read_string("title", &title); - lisp_free(savegame); + if (savegame) + { + LispReader reader(lisp_cdr(savegame)); + reader.read_string("title", &title); + lisp_free(savegame); + } if (access(slotfile, F_OK) == 0) {