split worldmap into several files, updates, use SDL_Delay earlier to reduce CPU usage...
[supertux.git] / src / mainloop.cpp
index 1c98cd4..1be0114 100644 (file)
@@ -1,5 +1,5 @@
-//  $Id: worldmap.hpp 2800 2005-10-02 22:57:31Z matzebraun $
-// 
+//  $Id$
+//
 //  SuperTux
 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
 //
@@ -12,7 +12,7 @@
 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 //  GNU General Public License for more details.
-// 
+//
 //  You should have received a copy of the GNU General Public License
 //  along with this program; if not, write to the Free Software
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
@@ -29,6 +29,7 @@
 #include "gameconfig.hpp"
 #include "main.hpp"
 #include "resources.hpp"
+#include "script_manager.hpp"
 #include "screen.hpp"
 #include "timer.hpp"
 
@@ -42,7 +43,6 @@ MainLoop* main_loop = NULL;
 MainLoop::MainLoop()
   : speed(1.0)
 {
-  console.reset(new Console());
 }
 
 MainLoop::~MainLoop()
@@ -64,6 +64,10 @@ MainLoop::push_screen(Screen* screen)
 void
 MainLoop::exit_screen()
 {
+  if (screen_stack.size() < 1) {
+    quit();
+    return;
+  }
   next_screen.reset(screen_stack.back());
   nextpush = false;
   screen_stack.pop_back();
@@ -97,10 +101,13 @@ MainLoop::run()
   running = true;
   while(running) {
     if(next_screen.get() != NULL) {
-      if(nextpush)
+      if(nextpush && current_screen.get() != NULL) {
+        current_screen->leave();
         screen_stack.push_back(current_screen.release());
+      }
       
       next_screen->setup();
+      ScriptManager::instance->fire_wakeup_event(ScriptManager::SCREEN_SWITCHED);
       current_screen.reset(next_screen.release());
       next_screen.reset(NULL);
       nextpush = false;
@@ -126,8 +133,8 @@ MainLoop::run()
         /* just wait */
         // If we really have to wait long, then do an imprecise SDL_Delay()
         Uint32 diff = fps_nextframe_ticks - ticks;
-        if(diff > 15) {
-          SDL_Delay(diff - 10);
+        if(diff > 10) {
+          SDL_Delay(diff - 2);
         }
         ticks = SDL_GetTicks();
       }
@@ -138,7 +145,7 @@ MainLoop::run()
       current_screen->draw(context);
       if(Menu::current() != NULL)
           Menu::current()->draw(context);
-      console->draw(context);
+      Console::instance->draw(context);
 
       context.do_drawing();
 
@@ -159,8 +166,10 @@ MainLoop::run()
     elapsed_time *= speed;
 
     game_time += elapsed_time;
+    ScriptManager::instance->update();
     current_screen->update(elapsed_time);
-
+    Console::instance->update(elapsed_time);
     main_controller->update();
     SDL_Event event;
     while(SDL_PollEvent(&event)) {