Exclude end sequence from focus lose code
[supertux.git] / src / supertux / game_session.cpp
index 0dd39b8..4d7652d 100644 (file)
@@ -75,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;
@@ -130,9 +131,13 @@ GameSession::restart_level()
     ScreenManager::current()->pop_screen();
     return (-1);
   }
-
-  SoundManager::current()->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
@@ -249,6 +254,7 @@ GameSession::toggle_pause()
     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;
   }
 
@@ -267,6 +273,12 @@ GameSession::abort_level()
   currentStatus->max_ice_bullets = max_ice_bullets_at_start;
 }
 
+bool
+GameSession::is_active() const
+{
+  return !game_pause && active && !end_sequence;
+}
+
 void
 GameSession::set_editmode(bool edit_mode_)
 {
@@ -370,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);
   }
 }
 
@@ -406,6 +418,7 @@ 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;
+    active = false;
     ScreenManager::current()->push_screen(std::unique_ptr<Screen>(new LevelIntro(level.get(), best_level_statistics)));
   }
 }
@@ -418,13 +431,20 @@ GameSession::leave()
 void
 GameSession::update(float elapsed_time)
 {
+  // Set active flag
+  if(!active)
+  {
+    active = true;
+  }
   // handle controller
-  if(InputManager::current()->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(InputManager::current()->get_controller()->pressed(Controller::CHEAT_MENU))
+  if(InputManager::current()->get_controller()->pressed(Controller::CHEAT_MENU) &&
+     g_config->developer_mode)
   {
     if (!MenuManager::instance().is_active())
     {
@@ -438,6 +458,7 @@ GameSession::update(float elapsed_time)
   // Unpause the game if the menu has been closed
   if (game_pause && !MenuManager::instance().is_active()) {
     ScreenManager::current()->set_speed(speed_before_pause);
+    SoundManager::current()->resume_music();
     game_pause = false;
   }
 
@@ -476,8 +497,11 @@ GameSession::update(float elapsed_time)
     }
   }
 
+  if(currentsector == NULL)
+    return;
+  
   // update sounds
-  if (currentsector && currentsector->camera) SoundManager::current()->set_listener_position(currentsector->camera->get_center());
+  if (currentsector->camera) SoundManager::current()->set_listener_position(currentsector->camera->get_center());
 
   /* Handle music: */
   if (end_sequence)
@@ -565,12 +589,12 @@ 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<EndSequenceWalkLeft>();
     } else {
-      end_sequence = new EndSequenceWalkRight();
+      end_sequence = std::make_shared<EndSequenceWalkRight>();
     }
   } else if (sequencename == "fireworks") {
-    end_sequence = new EndSequenceFireworks();
+    end_sequence = std::make_shared<EndSequenceFireworks>();
   } else {
     log_warning << "Unknown sequence '" << sequencename << "'. Ignoring." << std::endl;
     return;
@@ -586,12 +610,12 @@ GameSession::start_sequence(const std::string& sequencename)
   currentsector->player->set_winning();
 
   // Stop all clocks.
-  for(std::vector<GameObject*>::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<LevelTime*> (obj);
+    auto lt = std::dynamic_pointer_cast<LevelTime>(obj);
     if(lt)
       lt->stop();
   }