X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fgame_session.cpp;h=d29300d922ae8595aec68890eb3977dec813d2c5;hb=590805b8b24971ca43f777abfbf79fce21792804;hp=b83453da10982459a39d6c69bb85018240160ee1;hpb=8093970d54ab3cf3516fce99850d6506235946af;p=supertux.git diff --git a/src/supertux/game_session.cpp b/src/supertux/game_session.cpp index b83453da1..d29300d92 100644 --- a/src/supertux/game_session.cpp +++ b/src/supertux/game_session.cpp @@ -30,6 +30,8 @@ #include "object/endsequence_walkright.hpp" #include "object/level_time.hpp" #include "object/player.hpp" +#include "scripting/scripting.hpp" +#include "scripting/squirrel_util.hpp" #include "scripting/squirrel_util.hpp" #include "supertux/gameconfig.hpp" #include "supertux/globals.hpp" @@ -55,7 +57,7 @@ GameSession::GameSession(const std::string& levelfile_, Savegame& savegame, Stat pause_menu_frame(), end_sequence(0), game_pause(false), - speed_before_pause(g_screen_manager->get_speed()), + speed_before_pause(ScreenManager::current()->get_speed()), levelfile(levelfile_), reset_sector(), reset_pos(), @@ -73,14 +75,15 @@ GameSession::GameSession(const std::string& levelfile_, Savegame& savegame, Stat coins_at_start(), bonus_at_start(), max_fire_bullets_at_start(), - max_ice_bullets_at_start() + max_ice_bullets_at_start(), + active(false) { if (restart_level() != 0) throw std::runtime_error ("Initializing the level failed."); } int -GameSession::restart_level() +GameSession::restart_level(bool after_death) { PlayerStatus* currentStatus = m_savegame.get_player_status(); coins_at_start = currentStatus->coins; @@ -96,7 +99,7 @@ GameSession::restart_level() game_pause = false; end_sequence = 0; - g_input_manager->reset(); + InputManager::current()->reset(); currentsector = 0; @@ -125,12 +128,16 @@ GameSession::restart_level() } } catch(std::exception& e) { log_fatal << "Couldn't start level: " << e.what() << std::endl; - g_screen_manager->pop_screen(); + ScreenManager::current()->pop_screen(); return (-1); } - - sound_manager->stop_music(); - currentsector->play_music(LEVEL_MUSIC); + if(after_death == true) { + currentsector->resume_music(); + } + else { + SoundManager::current()->stop_music(); + currentsector->play_music(LEVEL_MUSIC); + } if(capture_file != "") { int newSeed=0; // next run uses a new seed @@ -244,9 +251,10 @@ GameSession::toggle_pause() // pause if (!game_pause && !MenuManager::instance().is_active()) { - speed_before_pause = g_screen_manager->get_speed(); - g_screen_manager->set_speed(0); + speed_before_pause = ScreenManager::current()->get_speed(); + ScreenManager::current()->set_speed(0); MenuManager::instance().set_menu(MenuStorage::GAME_MENU); + SoundManager::current()->pause_music(); game_pause = true; } @@ -257,7 +265,7 @@ void GameSession::abort_level() { MenuManager::instance().clear_menu_stack(); - g_screen_manager->pop_screen(); + ScreenManager::current()->pop_screen(); currentsector->player->set_bonus(bonus_at_start); PlayerStatus *currentStatus = m_savegame.get_player_status(); currentStatus->coins = coins_at_start; @@ -265,15 +273,21 @@ GameSession::abort_level() currentStatus->max_ice_bullets = max_ice_bullets_at_start; } +bool +GameSession::is_active() const +{ + return !game_pause && active; +} + void -GameSession::set_editmode(bool edit_mode) +GameSession::set_editmode(bool edit_mode_) { - if (this->edit_mode == edit_mode) return; - this->edit_mode = edit_mode; + if (this->edit_mode == edit_mode_) return; + this->edit_mode = edit_mode_; - currentsector->get_players()[0]->set_edit_mode(edit_mode); + currentsector->get_players()[0]->set_edit_mode(edit_mode_); - if (edit_mode) { + if (edit_mode_) { // entering edit mode @@ -349,7 +363,7 @@ GameSession::process_events() // save input for demo? if(capture_demo_stream != 0) { - Controller *controller = g_input_manager->get_controller(); + Controller *controller = InputManager::current()->get_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)); @@ -368,7 +382,7 @@ GameSession::check_end_conditions() if(end_sequence && end_sequence->is_done()) { finish(true); } else if (!end_sequence && tux->is_dead()) { - restart_level(); + restart_level(true); } } @@ -404,7 +418,8 @@ GameSession::setup() 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(std::unique_ptr(new LevelIntro(level.get(), best_level_statistics))); + active = false; + ScreenManager::current()->push_screen(std::unique_ptr(new LevelIntro(level.get(), best_level_statistics))); } } @@ -416,13 +431,20 @@ GameSession::leave() void GameSession::update(float elapsed_time) { + // Set active flag + if(!active) + { + active = true; + } // handle controller - if(g_input_manager->get_controller()->pressed(Controller::PAUSE_MENU)) + if(InputManager::current()->get_controller()->pressed(Controller::ESCAPE) || + InputManager::current()->get_controller()->pressed(Controller::START)) { on_escape_press(); } - if(g_input_manager->get_controller()->pressed(Controller::CHEAT_MENU)) + if(InputManager::current()->get_controller()->pressed(Controller::CHEAT_MENU) && + g_config->developer_mode) { if (!MenuManager::instance().is_active()) { @@ -435,7 +457,8 @@ GameSession::update(float elapsed_time) // Unpause the game if the menu has been closed if (game_pause && !MenuManager::instance().is_active()) { - g_screen_manager->set_speed(speed_before_pause); + ScreenManager::current()->set_speed(speed_before_pause); + SoundManager::current()->resume_music(); game_pause = false; } @@ -474,8 +497,11 @@ GameSession::update(float elapsed_time) } } + if(currentsector == NULL) + return; + // update sounds - if (currentsector && currentsector->camera) sound_manager->set_listener_position(currentsector->camera->get_center()); + if (currentsector->camera) SoundManager::current()->set_listener_position(currentsector->camera->get_center()); /* Handle music: */ if (end_sequence) @@ -515,7 +541,7 @@ GameSession::finish(bool win) } } - g_screen_manager->pop_screen(); + ScreenManager::current()->pop_screen(); } void @@ -563,33 +589,33 @@ GameSession::start_sequence(const std::string& sequencename) if (sequencename == "endsequence") { if (currentsector->get_players()[0]->get_physic().get_velocity_x() < 0) { - end_sequence = new EndSequenceWalkLeft(); + end_sequence = std::make_shared(); } else { - end_sequence = new EndSequenceWalkRight(); + end_sequence = std::make_shared(); } } else if (sequencename == "fireworks") { - end_sequence = new EndSequenceFireworks(); + end_sequence = std::make_shared(); } else { log_warning << "Unknown sequence '" << sequencename << "'. Ignoring." << std::endl; return; } /* slow down the game for end-sequence */ - g_screen_manager->set_speed(0.5f); + ScreenManager::current()->set_speed(0.5f); currentsector->add_object(end_sequence); end_sequence->start(); - sound_manager->play_music("music/leveldone.ogg", false); + SoundManager::current()->play_music("music/leveldone.ogg", false); currentsector->player->set_winning(); // Stop all clocks. - for(std::vector::iterator i = currentsector->gameobjects.begin(); + for(auto i = currentsector->gameobjects.begin(); i != currentsector->gameobjects.end(); ++i) { - GameObject* obj = *i; + GameObjectPtr obj = *i; - LevelTime* lt = dynamic_cast (obj); + auto lt = std::dynamic_pointer_cast(obj); if(lt) lt->stop(); }