fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / mainloop.cpp
index 4e7199d..9f8be24 100644 (file)
 #include "control/joystickkeyboardcontroller.hpp"
 #include "gui/menu.hpp"
 #include "audio/sound_manager.hpp"
+#include "scripting/time_scheduler.hpp"
+#include "scripting/squirrel_util.hpp"
 #include "gameconfig.hpp"
 #include "main.hpp"
 #include "resources.hpp"
-#include "script_manager.hpp"
 #include "screen.hpp"
 #include "screen_fade.hpp"
 #include "timer.hpp"
 #include "player_status.hpp"
+#include "random_generator.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"
@@ -43,12 +45,18 @@ static const float LOGICAL_FPS = 64.0;
 MainLoop* main_loop = NULL;
 
 MainLoop::MainLoop()
-  : speed(1.0)
+  : speed(1.0), nextpop(false), nextpush(false)
 {
+  using namespace Scripting;
+  TimeScheduler::instance = new TimeScheduler();
 }
 
 MainLoop::~MainLoop()
 {
+  using namespace Scripting;
+  delete TimeScheduler::instance;
+  TimeScheduler::instance = NULL;
+
   for(std::vector<Screen*>::iterator i = screen_stack.begin();
       i != screen_stack.end(); ++i) {
     delete *i;
@@ -60,6 +68,10 @@ MainLoop::push_screen(Screen* screen, ScreenFade* screen_fade)
 {
   this->next_screen.reset(screen);
   this->screen_fade.reset(screen_fade);
+  if(nextpop)
+    nextpush = false;
+  else
+    nextpush = true;
   nextpop = false;
   speed = 1.0;
 }
@@ -70,6 +82,7 @@ MainLoop::exit_screen(ScreenFade* screen_fade)
   next_screen.reset(NULL);
   this->screen_fade.reset(screen_fade);
   nextpop = true;
+  nextpush = false;
 }
 
 void
@@ -102,24 +115,24 @@ MainLoop::draw_fps(DrawingContext& context, float fps_fps)
   snprintf(str, sizeof(str), "%3.1f", fps_fps);
   const char* fpstext = "FPS";
   context.draw_text(white_text, fpstext, Vector(SCREEN_WIDTH - white_text->get_text_width(fpstext) - gold_text->get_text_width(" 99999") - BORDER_X, BORDER_Y + 20), LEFT_ALLIGN, LAYER_FOREGROUND1);
-  context.draw_text(gold_text, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), RIGHT_ALLIGN, LAYER_FOREGROUND1);                    
+  context.draw_text(gold_text, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), RIGHT_ALLIGN, LAYER_FOREGROUND1);
 }
 
 void
 MainLoop::run()
 {
-  DrawingContext context; 
-  
-  unsigned int frame_count;
+  DrawingContext context;
+
+  unsigned int frame_count = 0;
   float fps_fps = 0;
   Uint32 fps_ticks = SDL_GetTicks();
   Uint32 fps_nextframe_ticks = SDL_GetTicks();
   Uint32 ticks;
   bool skipdraw = false;
-  
+
   running = true;
   while(running) {
-    if( (next_screen.get() != NULL || nextpop == true) &&
+    while( (next_screen.get() != NULL || nextpop == true) &&
             (screen_fade.get() == NULL || screen_fade->done())) {
       if(current_screen.get() != NULL) {
         current_screen->leave();
@@ -132,22 +145,25 @@ MainLoop::run()
         }
         next_screen.reset(screen_stack.back());
         screen_stack.pop_back();
-        nextpop = false;
-        speed = 1.0;
-      } else if(current_screen.get() != NULL) {
+      }
+      if(nextpush && current_screen.get() != NULL) {
         screen_stack.push_back(current_screen.release());
       }
-      
-      next_screen->setup();
-      ScriptManager::instance->fire_wakeup_event(ScriptManager::SCREEN_SWITCHED);
+
+      nextpush = false;
+      nextpop = false;
+      speed = 1.0;
+      if(next_screen.get() != NULL)
+        next_screen->setup();
       current_screen.reset(next_screen.release());
-      next_screen.reset(NULL);
       screen_fade.reset(NULL);
+
+      waiting_threads.wakeup();
     }
 
-    if(current_screen.get() == NULL)
-        break;
-      
+    if(!running || current_screen.get() == NULL)
+      break;
+
     float elapsed_time = 1.0 / LOGICAL_FPS;
     ticks = SDL_GetTicks();
     if(ticks > fps_nextframe_ticks) {
@@ -190,7 +206,7 @@ MainLoop::run()
       if(config->show_fps)
       {
         ++frame_count;
-        
+
         if(SDL_GetTicks() - fps_ticks >= 500)
         {
           fps_fps = (float) frame_count / .5;
@@ -200,15 +216,17 @@ MainLoop::run()
       }
     }
 
+    real_time += elapsed_time;
     elapsed_time *= speed;
-
     game_time += elapsed_time;
-    ScriptManager::instance->update();
+
+    Scripting::update_debugger();
+    Scripting::TimeScheduler::instance->update(game_time);
     current_screen->update(elapsed_time);
     if(screen_fade.get() != NULL)
       screen_fade->update(elapsed_time);
     Console::instance->update(elapsed_time);
+
     main_controller->update();
     SDL_Event event;
     while(SDL_PollEvent(&event)) {
@@ -220,6 +238,7 @@ MainLoop::run()
     }
 
     sound_manager->update();
+
+    //log_info << "== periodic rand() = " << systemRandom.rand() << std::endl;
   }
 }
-