Crude hack to slow down the game, use set_game_speed(2.0) in console to run at half...
authorIngo Ruhnke <grumbel@gmx.de>
Mon, 5 May 2008 16:29:53 +0000 (16:29 +0000)
committerIngo Ruhnke <grumbel@gmx.de>
Mon, 5 May 2008 16:29:53 +0000 (16:29 +0000)
SVN-Revision: 5415

src/mainloop.cpp
src/scripting/functions.cpp
src/scripting/functions.hpp
src/scripting/wrapper.cpp

index e5db024..3d4ec4b 100644 (file)
@@ -46,6 +46,8 @@ static const Uint32 TICKS_PER_FRAME = (Uint32) (1000.0 / LOGICAL_FPS);
 /** don't skip more than every 2nd frame */
 static const int MAX_FRAME_SKIP = 2;
 
+float game_speed = 1.0f;
+
 MainLoop* main_loop = NULL;
 
 MainLoop::MainLoop()
@@ -244,7 +246,9 @@ MainLoop::run(DrawingContext &context)
     elapsed_ticks += ticks - last_ticks;
     last_ticks = ticks;
 
-    if (elapsed_ticks > TICKS_PER_FRAME*4) {
+    Uint32 ticks_per_frame = TICKS_PER_FRAME * game_speed;
+
+    if (elapsed_ticks > ticks_per_frame*4) {
       // when the game loads up or levels are switched the
       // elapsed_ticks grows extremly large, so we just ignore those
       // large time jumps
@@ -253,22 +257,24 @@ MainLoop::run(DrawingContext &context)
 
     int frames = 0;
 
-    if (elapsed_ticks > TICKS_PER_FRAME) {
-      while(elapsed_ticks > TICKS_PER_FRAME && frames < MAX_FRAME_SKIP) {
-        elapsed_ticks -= TICKS_PER_FRAME;
-        float timestep = 1.0 / LOGICAL_FPS;
-        real_time += timestep;
-        timestep *= speed;
-        game_time += timestep;
-
-        process_events();
-        update_gamelogic(timestep);
-        frames += 1;
+    if (elapsed_ticks > ticks_per_frame) 
+      {
+        while(elapsed_ticks > ticks_per_frame && frames < MAX_FRAME_SKIP) 
+          {
+            elapsed_ticks -= ticks_per_frame;
+            float timestep = 1.0 / LOGICAL_FPS;
+            real_time += timestep;
+            timestep *= speed;
+            game_time += timestep;
+
+            process_events();
+            update_gamelogic(timestep);
+            frames += 1;
+          }
+
+        draw(context);
       }
 
-      draw(context);
-    }
-
     sound_manager->update();
 
     SDL_Delay(0);
index 36e4705..e53a837 100644 (file)
@@ -51,6 +51,8 @@
 #include "squirrel_util.hpp"
 #include "time_scheduler.hpp"
 
+extern float game_speed;
+
 namespace Scripting
 {
 
@@ -285,4 +287,9 @@ int rand()
   return systemRandom.rand();
 }
 
+void set_game_speed(float speed)
+{
+  ::game_speed = speed;
+}
+
 }
index d56f6c2..afa649a 100644 (file)
@@ -141,6 +141,11 @@ void play_music(const std::string& musicfile);
 void play_sound(const std::string& soundfile);
 
 /**
+ *  Set the game_speed
+ */
+void set_game_speed(float speed);
+
+/**
  * speeds Tux up
  */
 void grease();
index d001bbb..7a5ab30 100644 (file)
@@ -3536,6 +3536,29 @@ static SQInteger play_sound_wrapper(HSQUIRRELVM vm)
 
 }
 
+static SQInteger set_game_speed_wrapper(HSQUIRRELVM vm)
+{
+  SQFloat arg0;
+  if(SQ_FAILED(sq_getfloat(vm, 2, &arg0))) {
+    sq_throwerror(vm, _SC("Argument 1 not a float"));
+    return SQ_ERROR;
+  }
+
+  try {
+    Scripting::set_game_speed(static_cast<float> (arg0));
+
+    return 0;
+
+  } catch(std::exception& e) {
+    sq_throwerror(vm, e.what());
+    return SQ_ERROR;
+  } catch(...) {
+    sq_throwerror(vm, _SC("Unexpected exception while executing function 'set_game_speed'"));
+    return SQ_ERROR;
+  }
+
+}
+
 static SQInteger grease_wrapper(HSQUIRRELVM vm)
 {
   (void) vm;
@@ -4327,6 +4350,12 @@ void register_supertux_wrapper(HSQUIRRELVM v)
     throw SquirrelError(v, "Couldn't register function 'play_sound'");
   }
 
+  sq_pushstring(v, "set_game_speed", -1);
+  sq_newclosure(v, &set_game_speed_wrapper, 0);
+  if(SQ_FAILED(sq_createslot(v, -3))) {
+    throw SquirrelError(v, "Couldn't register function 'set_game_speed'");
+  }
+
   sq_pushstring(v, "grease", -1);
   sq_newclosure(v, &grease_wrapper, 0);
   if(SQ_FAILED(sq_createslot(v, -3))) {