GameSession::restart_level()
{
game_pause = false;
- exit_status = NONE;
+ exit_status = ES_NONE;
end_sequence = NO_ENDSEQUENCE;
fps_timer.init(true);
if(st_gl_mode == ST_GL_TEST)
{
- exit_status = LEVEL_ABORT;
+ exit_status = ES_LEVEL_ABORT;
}
else if (!Menu::current())
{
Menu::set_current(game_menu);
+ st_pause_ticks_start();
}
}
if (Menu::current())
{
Menu::current()->event(event);
- st_pause_ticks_start();
+ if(!Menu::current())
+ st_pause_ticks_stop();
}
switch(event.type)
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
{
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;
+ exit_status = ES_LEVEL_FINISHED;
return;
}
else if(end_sequence == ENDSEQUENCE_RUNNING && endtile && endtile->data >= 1)
last_x_pos = -1;
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.bonus = PlayerStatus::NO_BONUS;
- player_status.lives -= 1;
if (player_status.lives < 0)
{ // No more lives!?
if(st_gl_mode != ST_GL_TEST)
drawendscreen();
- exit_status = GAME_OVER;
+ exit_status = ES_GAME_OVER;
}
else
{ // Still has lives, so reset Tux to the levelstart
void
GameSession::action(double frame_ratio)
{
- if (exit_status == NONE)
+ if (exit_status == ES_NONE)
{
// Update Tux and the World
world->action(frame_ratio);
break;
case MNID_ABORTLEVEL:
st_pause_ticks_stop();
- exit_status = LEVEL_ABORT;
+ exit_status = ES_LEVEL_ABORT;
break;
}
}
draw();
- float overlap = 0.0f;
- while (exit_status == NONE)
+ while (exit_status == ES_NONE)
{
/* Calculate the movement-factor */
double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
// 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
- check_end_conditions();
- if (end_sequence == ENDSEQUENCE_RUNNING)
- action(.5f);
- else if(end_sequence == NO_ENDSEQUENCE)
- 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
{
}
/* 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: */