added some comments and the framework for platforms that travel back and forth on...
[supertux.git] / src / game_session.cpp
index 1402e64..efbc9c5 100644 (file)
 
 #include <SDL.h>
 
-#ifndef WIN32
-#include <sys/types.h>
-#include <ctype.h>
-#endif
-
-#include "game_session.h"
-#include "video/screen.h"
-#include "gui/menu.h"
-#include "sector.h"
-#include "level.h"
-#include "tile.h"
-#include "player_status.h"
-#include "object/particlesystem.h"
-#include "object/background.h"
-#include "object/tilemap.h"
-#include "object/camera.h"
-#include "object/player.h"
-#include "lisp/lisp.h"
-#include "lisp/parser.h"
-#include "resources.h"
-#include "worldmap.h"
-#include "misc.h"
-#include "statistics.h"
-#include "timer.h"
-#include "object/fireworks.h"
-#include "textscroller.h"
-#include "control/codecontroller.h"
-#include "control/joystickkeyboardcontroller.h"
-#include "main.h"
-#include "gameconfig.h"
-#include "gettext.h"
-
-// the engine will be run with a lofical framerate of 64fps.
-// We choose 64fps here because it is a power of 2, so 1/64 gives an "even"
+#include "game_session.hpp"
+#include "video/screen.hpp"
+#include "audio/sound_manager.hpp"
+#include "gui/menu.hpp"
+#include "sector.hpp"
+#include "level.hpp"
+#include "tile.hpp"
+#include "player_status.hpp"
+#include "object/particlesystem.hpp"
+#include "object/background.hpp"
+#include "object/tilemap.hpp"
+#include "object/camera.hpp"
+#include "object/player.hpp"
+#include "lisp/lisp.hpp"
+#include "lisp/parser.hpp"
+#include "resources.hpp"
+#include "worldmap.hpp"
+#include "misc.hpp"
+#include "statistics.hpp"
+#include "timer.hpp"
+#include "object/fireworks.hpp"
+#include "textscroller.hpp"
+#include "control/codecontroller.hpp"
+#include "control/joystickkeyboardcontroller.hpp"
+#include "main.hpp"
+#include "file_system.hpp"
+#include "gameconfig.hpp"
+#include "gettext.hpp"
+
+// the engine will be run with a logical framerate of 64fps.
+// We chose 64fps here because it is a power of 2, so 1/64 gives an "even"
 // binary fraction...
 static const float LOGICAL_FPS = 64.0;
 
@@ -82,8 +79,10 @@ GameSession::GameSession(const std::string& levelfile_, GameSessionMode mode,
     capture_demo_stream(0), playback_demo_stream(0), demo_controller(0)
 {
   current_ = this;
+  currentsector = 0;
   
   game_pause = false;
+  music_playing = false;
   fps_fps = 0;
 
   context = new DrawingContext();
@@ -129,7 +128,11 @@ GameSession::restart_level()
   if(mode == ST_GL_PLAY || mode == ST_GL_LOAD_LEVEL_FILE)
     levelintro();
 
-  currentsector->play_music(LEVEL_MUSIC);
+  if (!music_playing)
+  {
+    currentsector->play_music(LEVEL_MUSIC);
+    music_playing = true;
+  }
 
   if(capture_file != "")
     record_demo(capture_file);
@@ -181,8 +184,6 @@ GameSession::play_demo(const std::string& filename)
 void
 GameSession::levelintro()
 {
-  sound_manager->halt_music();
-  
   char str[60];
 
   DrawingContext context;
@@ -423,6 +424,9 @@ GameSession::update(float elapsed_time)
     newsector = "";
     newspawnpoint = "";
   }
+
+  // update sounds
+  sound_manager->set_listener_position(currentsector->player->get_pos());
 }
 
 void 
@@ -524,7 +528,7 @@ GameSession::run()
     static const float elapsed_time = 1.0 / LOGICAL_FPS;
     // old code... float elapsed_time = float(ticks - lastticks) / 1000.;
     if(!game_pause)
-      global_time += elapsed_time;
+      game_time += elapsed_time;
 
     // regulate fps
     ticks = SDL_GetTicks();
@@ -586,6 +590,9 @@ GameSession::run()
     if(!skipdraw)
       draw();
 
+    // update sounds
+    sound_manager->update();
+
     /* Time stops in pause mode */
     if(game_pause || Menu::current())
     {
@@ -648,6 +655,12 @@ GameSession::set_reset_point(const std::string& sector, const Vector& pos)
   reset_pos = pos;
 }
 
+std::string
+GameSession::get_working_directory()
+{
+  return FileSystem::dirname(levelfile);
+}
+
 void
 GameSession::display_info_box(const std::string& text)
 {
@@ -671,6 +684,7 @@ GameSession::display_info_box(const std::string& text)
       running = false;
     box->draw(*context);
     draw();
+    sound_manager->update();
   }
 
   delete box;
@@ -686,7 +700,7 @@ GameSession::start_sequence(const std::string& sequencename)
     end_sequence = ENDSEQUENCE_RUNNING;
     endsequence_timer.start(7.0); // 7 seconds until we finish the map
     last_x_pos = -1;
-    sound_manager->play_music(level_end_song, 0);
+    sound_manager->play_music("music/leveldone.ogg", false);
     currentsector->player->invincible_timer.start(7.0);
 
     if(sequencename == "fireworks") {
@@ -753,7 +767,7 @@ std::string slotinfo(int slot)
   std::string title;
   std::stringstream stream;
   stream << slot;
-  slotfile = user_dir + "/save/slot" + stream.str() + ".stsg";
+  slotfile = "save/slot" + stream.str() + ".stsg";
 
   try {
     lisp::Parser parser;
@@ -784,8 +798,9 @@ bool process_load_game_menu()
   
   std::stringstream stream;
   stream << slot;
-  std::string slotfile = user_dir + "/save/slot" + stream.str() + ".stsg";
+  std::string slotfile = "save/slot" + stream.str() + ".stsg";
 
+  sound_manager->stop_music();
   fadeout(256);
   DrawingContext context;
   context.draw_text(white_text, "Loading...",