X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fgame_session.cpp;h=c338d16800a5281cc0c933e19350bebd5f90d6e2;hb=08bddcf4d4fbe2edf9a0078dc6f3c3275ef05302;hp=d4df670f120f9a5395a9119c2724f2dfd8dfa64b;hpb=5adf1502b4526fdbf8f05bb816cafc8f57cb5951;p=supertux.git diff --git a/src/supertux/game_session.cpp b/src/supertux/game_session.cpp index d4df670f1..c338d1680 100644 --- a/src/supertux/game_session.cpp +++ b/src/supertux/game_session.cpp @@ -76,24 +76,25 @@ GameSession::GameSession(const std::string& levelfile_, PlayerStatus* player_sta statistics_backdrop = Surface::create("images/engine/menu/score-backdrop.png"); - restart_level(); + if (restart_level() != 0) + throw std::runtime_error ("Initializing the level failed."); game_menu.reset(new GameMenu(*level)); } -void +int GameSession::restart_level() { if (edit_mode) { force_ghost_mode(); - return; + return (-1); } game_pause = false; end_sequence = 0; - g_main_controller->reset(); + g_jk_controller->reset(); currentsector = 0; @@ -112,7 +113,6 @@ GameSession::restart_level() msg << "Couldn't find sector '" << reset_sector << "' for resetting tux."; throw std::runtime_error(msg.str()); } - level->stats.declare_invalid(); currentsector->activate(reset_pos); } else { currentsector = level->get_sector("main"); @@ -124,6 +124,7 @@ GameSession::restart_level() } catch(std::exception& e) { log_fatal << "Couldn't start level: " << e.what() << std::endl; g_screen_manager->exit_screen(); + return (-1); } sound_manager->stop_music(); @@ -132,11 +133,13 @@ GameSession::restart_level() if(capture_file != "") { int newSeed=0; // next run uses a new seed while (newSeed == 0) // which is the next non-zero random num. - newSeed = systemRandom.rand(); - g_config->random_seed = systemRandom.srand(newSeed); + newSeed = gameRandom.rand(); + g_config->random_seed = gameRandom.srand(newSeed); log_info << "Next run uses random seed " << g_config->random_seed <put(g_main_controller->hold(Controller::LEFT)); - capture_demo_stream ->put(g_main_controller->hold(Controller::RIGHT)); - capture_demo_stream ->put(g_main_controller->hold(Controller::UP)); - capture_demo_stream ->put(g_main_controller->hold(Controller::DOWN)); - capture_demo_stream ->put(g_main_controller->hold(Controller::JUMP)); - capture_demo_stream ->put(g_main_controller->hold(Controller::ACTION)); + Controller *controller = g_jk_controller->get_main_controller(); + capture_demo_stream ->put(controller->hold(Controller::LEFT)); + capture_demo_stream ->put(controller->hold(Controller::RIGHT)); + capture_demo_stream ->put(controller->hold(Controller::UP)); + capture_demo_stream ->put(controller->hold(Controller::DOWN)); + capture_demo_stream ->put(controller->hold(Controller::JUMP)); + capture_demo_stream ->put(controller->hold(Controller::ACTION)); } } @@ -394,7 +398,8 @@ GameSession::process_menu() case MNID_ABORTLEVEL: MenuManager::set_current(0); g_screen_manager->exit_screen(); - break; + // TODO: revert coins and powerups to previous + // values so as to discourage powerup "farming" } } } @@ -403,6 +408,9 @@ GameSession::process_menu() void GameSession::setup() { + if (currentsector == NULL) + return; + if(currentsector != Sector::current()) { currentsector->activate(currentsector->player->get_pos()); } @@ -413,7 +421,8 @@ GameSession::setup() while(SDL_PollEvent(&event)) {} - if (!levelintro_shown) { + int total_stats_to_be_collected = level->stats.total_coins + level->stats.total_badguys + level->stats.total_secrets; + if ((!levelintro_shown) && (total_stats_to_be_collected > 0)) { levelintro_shown = true; g_screen_manager->push_screen(new LevelIntro(level.get(), best_level_statistics)); } @@ -423,7 +432,7 @@ void GameSession::update(float elapsed_time) { // handle controller - if(g_main_controller->pressed(Controller::PAUSE_MENU)) + if(g_jk_controller->get_main_controller()->pressed(Controller::PAUSE_MENU)) on_escape_press(); process_events(); @@ -570,7 +579,7 @@ GameSession::start_sequence(const std::string& sequencename) end_sequence->start(); sound_manager->play_music("music/leveldone.ogg", false); - currentsector->player->invincible_timer.start(10000.0f); + currentsector->player->set_winning(); // Stop all clocks. for(std::vector::iterator i = currentsector->gameobjects.begin();