When creating a brick object to handle tiles with attribute brick the iced image...
[supertux.git] / src / supertux / game_session.cpp
index b1396bf..c338d16 100644 (file)
@@ -43,7 +43,7 @@
 #include "util/gettext.hpp"
 #include "worldmap/worldmap.hpp"
 
-GameSession::GameSession(const std::string& levelfile_, Statistics* statistics) :
+GameSession::GameSession(const std::string& levelfile_, PlayerStatus* player_status, Statistics* statistics) :
   level(0), 
   statistics_backdrop(),
   scripts(),
@@ -59,6 +59,7 @@ GameSession::GameSession(const std::string& levelfile_, Statistics* statistics)
   newsector(),
   newspawnpoint(),
   best_level_statistics(statistics),
+  player_status(player_status),
   capture_demo_stream(0), 
   capture_file(),
   playback_demo_stream(0), 
@@ -73,26 +74,27 @@ GameSession::GameSession(const std::string& levelfile_, Statistics* statistics)
   game_pause = false;
   speed_before_pause = g_screen_manager->get_speed();
 
-  statistics_backdrop.reset(new Surface("images/engine/menu/score-backdrop.png"));
+  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;
 
@@ -111,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");
@@ -123,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();
@@ -131,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 <<std::endl;
     record_demo(capture_file);
   }
+
+  return (0);
 }
 
 GameSession::~GameSession()
@@ -339,12 +343,13 @@ GameSession::process_events()
 
   // save input for demo?
   if(capture_demo_stream != 0) {
-    capture_demo_stream ->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));
   }
 }
 
@@ -393,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"
       }
     }
   }
@@ -402,6 +408,9 @@ GameSession::process_menu()
 void
 GameSession::setup()
 {
+  if (currentsector == NULL)
+    return;
+
   if(currentsector != Sector::current()) {
     currentsector->activate(currentsector->player->get_pos());
   }
@@ -412,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));
   }
@@ -422,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();
@@ -568,8 +578,8 @@ GameSession::start_sequence(const std::string& sequencename)
   currentsector->add_object(end_sequence);
   end_sequence->start();
 
-  sound_manager->play_music("music/leveldone.music", false);
-  currentsector->player->invincible_timer.start(10000.0f);
+  sound_manager->play_music("music/leveldone.ogg", false);
+  currentsector->player->set_winning();
 
   // Stop all clocks.
   for(std::vector<GameObject*>::iterator i = currentsector->gameobjects.begin();
@@ -591,7 +601,7 @@ GameSession::drawstatus(DrawingContext& context)
 
   // draw level stats while end_sequence is running
   if (end_sequence) {
-    level->stats.draw_endseq_panel(context, best_level_statistics, statistics_backdrop.get());
+    level->stats.draw_endseq_panel(context, best_level_statistics, statistics_backdrop);
   }
 }