X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=78b4a88e7cc94ec181ed8794c72a3ba8e2bf731d;hb=cdb879de1ef50e2d2fb1aead922775d202ddd114;hp=a51a5fa332cbdd8473dd6bb6375b1e9e246b2a71;hpb=a9152a35ae53ccfa518160e66ff700cfd5f6d3be;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index a51a5fa33..78b4a88e7 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -58,7 +58,7 @@ GameSession* GameSession::current_ = 0; GameSession::GameSession(const std::string& subset_, int levelnb_, int mode) - : world(0), st_gl_mode(mode), levelnb(levelnb_), end_sequence(false), + : world(0), st_gl_mode(mode), levelnb(levelnb_), end_sequence(NO_ENDSEQUENCE), subset(subset_) { current_ = this; @@ -77,7 +77,7 @@ GameSession::restart_level() { game_pause = false; exit_status = NONE; - end_sequence = false; + end_sequence = NO_ENDSEQUENCE; fps_timer.init(true); frame_timer.init(true); @@ -188,18 +188,20 @@ GameSession::on_escape_press() else if (!Menu::current()) { Menu::set_current(game_menu); + st_pause_ticks_start(); } } void GameSession::process_events() { - if (end_sequence) + if (end_sequence != NO_ENDSEQUENCE) { Player& tux = *world->get_tux(); - + + tux.input.fire = UP; tux.input.left = UP; - tux.input.right = DOWN; + tux.input.right = DOWN; tux.input.down = UP; if (int(last_x_pos) == int(tux.base.x)) @@ -216,7 +218,8 @@ GameSession::process_events() if (Menu::current()) { Menu::current()->event(event); - st_pause_ticks_start(); + if(!Menu::current()) + st_pause_ticks_stop(); } switch(event.type) @@ -246,7 +249,7 @@ GameSession::process_events() } } } - else + else // normal mode { if(!Menu::current() && !game_pause) st_pause_ticks_stop(); @@ -258,7 +261,18 @@ GameSession::process_events() if (Menu::current()) { Menu::current()->event(event); - st_pause_ticks_start(); + if(!Menu::current()) + st_pause_ticks_stop(); + + /* Tell Tux that the keys are all down, otherwise + it could have nasty bugs, like going allways to the right + or whatever that key does */ + Player& tux = *world->get_tux(); + tux.key_event((SDLKey)keymap.jump, UP); + tux.key_event((SDLKey)keymap.duck, UP); + tux.key_event((SDLKey)keymap.left, UP); + tux.key_event((SDLKey)keymap.right, UP); + tux.key_event((SDLKey)keymap.fire, UP); } else { @@ -413,26 +427,38 @@ GameSession::check_end_conditions() Player* tux = world->get_tux(); /* End of level? */ - int endpos = (World::current()->get_level()->width-10) * 32; + int endpos = (World::current()->get_level()->width-5) * 32; Tile* endtile = collision_goal(tux->base); - //printf("EndTile: %p.\n", endtile); + // fallback in case the other endpositions don't trigger - if (tux->base.x >= endpos || (endtile && endtile->data >= 1) - || (end_sequence && !endsequence_timer.check())) + if (!end_sequence && tux->base.x >= endpos) + { + end_sequence = ENDSEQUENCE_WAITING; + last_x_pos = -1; + music_manager->play_music(level_end_song, 0); + endsequence_timer.start(7000); + tux->invincible_timer.start(7000); //FIXME: Implement a winning timer for the end sequence (with special winning animation etc.) + } + else if(end_sequence && !endsequence_timer.check()) { exit_status = LEVEL_FINISHED; return; } + else if(end_sequence == ENDSEQUENCE_RUNNING && endtile && endtile->data >= 1) + { + end_sequence = ENDSEQUENCE_WAITING; + } else if(!end_sequence && endtile && endtile->data == 0) { - end_sequence = true; + end_sequence = ENDSEQUENCE_RUNNING; last_x_pos = -1; - music_manager->halt_music(); - endsequence_timer.start(5000); // 5 seconds until we finish the map + music_manager->play_music(level_end_song, 0); + endsequence_timer.start(7000); // 5 seconds until we finish the map + tux->invincible_timer.start(7000); //FIXME: Implement a winning timer for the end sequence (with special winning animation etc.) } else if (!end_sequence && tux->is_dead()) { - player_status.lives -= 1; + player_status.bonus = PlayerStatus::NO_BONUS; if (player_status.lives < 0) { // No more lives!? @@ -453,8 +479,6 @@ GameSession::check_end_conditions() void GameSession::action(double frame_ratio) { - check_end_conditions(); - if (exit_status == NONE) { // Update Tux and the World @@ -530,17 +554,12 @@ GameSession::run() update_time = last_update_time = st_get_ticks(); - /* Clear screen: */ -// clearscreen(0, 0, 0); -// updatescreen(); - // Eat unneeded events SDL_Event event; while (SDL_PollEvent(&event)) {} draw(); - float overlap = 0.0f; while (exit_status == NONE) { /* Calculate the movement-factor */ @@ -563,18 +582,12 @@ GameSession::run() // determistic and not different on different machines if(!game_pause && !Menu::current()) { - frame_ratio *= game_speed; - frame_ratio += overlap; - while (frame_ratio > 0) - { - // Update the world - if (end_sequence) - action(.5f); - else - action(1.0f); - frame_ratio -= 1.0f; - } - overlap = frame_ratio; + // Update the world + check_end_conditions(); + if (end_sequence == ENDSEQUENCE_RUNNING) + action(frame_ratio/2); + else if(end_sequence == NO_ENDSEQUENCE) + action(frame_ratio); } else { @@ -604,22 +617,22 @@ GameSession::run() } /* Handle time: */ - if (!time_left.check() && world->get_tux()->dying == DYING_NOT) + if (!time_left.check() && world->get_tux()->dying == DYING_NOT + && !end_sequence) world->get_tux()->kill(Player::KILL); /* Handle music: */ - if(world->get_tux()->invincible_timer.check()) + if(world->get_tux()->invincible_timer.check() && !end_sequence) { - if(world->get_music_type() != HERRING_MUSIC) - world->play_music(HERRING_MUSIC); + world->play_music(HERRING_MUSIC); } /* are we low on time ? */ - else if (time_left.get_left() < TIME_WARNING) + else if (time_left.get_left() < TIME_WARNING && !end_sequence) { world->play_music(HURRYUP_MUSIC); } /* or just normal music? */ - else if(world->get_music_type() != LEVEL_MUSIC) + else if(world->get_music_type() != LEVEL_MUSIC && !end_sequence) { world->play_music(LEVEL_MUSIC); } @@ -681,7 +694,7 @@ GameSession::drawstatus() if (player_status.lives >= 5) { sprintf(str, "%dx", player_status.lives); - gold_text->draw(str, 585, 20); + gold_text->draw_align(str, 617, 20, A_RIGHT, A_TOP); tux_life->draw(565+(18*3), 20); } else