From df6ead5f93758aa9871594fc3872930eaf9c9d60 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 22:27:28 +0000 Subject: [PATCH] SCI: calling speed throttler as well from kPalette(setIntensity) if needed - fixes kq6 intro svn-id: r50794 --- engines/sci/engine/kmisc.cpp | 23 +---------------------- engines/sci/engine/state.cpp | 15 +++++++++++++++ engines/sci/engine/state.h | 1 + engines/sci/engine/vm.cpp | 3 +-- engines/sci/graphics/palette.cpp | 6 +++++- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 3d206d03582..1ed12c092e1 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -67,28 +67,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { neededSleep = 60; } - if (s->_throttleTrigger) { - // Some games seem to get the duration of main loop initially and then - // switch of animations for the whole game based on that (qfg2, iceman). - // We are now running full speed initially to avoid that. - // It seems like we dont need to do that anymore - //if (s->_throttleCounter < 50) { - // s->_throttleCounter++; - // return s->r_acc; - //} - - uint32 curTime = g_system->getMillis(); - uint32 duration = curTime - s->_throttleLastTime; - - if (duration < neededSleep) { - g_sci->sleep(neededSleep - duration); - s->_throttleLastTime = g_system->getMillis(); - } else { - s->_throttleLastTime = curTime; - } - s->_throttleTrigger = false; - } - + s->speedThrottler(neededSleep); return s->r_acc; } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 6f54a3c1991..245a021605f 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -111,6 +111,21 @@ void EngineState::reset(bool isRestoring) { scriptGCInterval = GC_INTERVAL; } +void EngineState::speedThrottler(uint32 neededSleep) { + if (_throttleTrigger) { + uint32 curTime = g_system->getMillis(); + uint32 duration = curTime - _throttleLastTime; + + if (duration < neededSleep) { + g_sci->sleep(neededSleep - duration); + _throttleLastTime = g_system->getMillis(); + } else { + _throttleLastTime = curTime; + } + _throttleTrigger = false; + } +} + void EngineState::wait(int16 ticks) { uint32 time = g_system->getMillis(); r_acc = make_reg(0, ((long)time - (long)lastWaitTime) * 60 / 1000); diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 885c8a871ce..e304c6d8894 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -106,6 +106,7 @@ public: uint32 lastWaitTime; /**< The last time the game invoked Wait() */ uint32 _screenUpdateTime; /**< The last time the game updated the screen */ + void speedThrottler(uint32 neededSleep); void wait(int16 ticks); uint32 _throttleCounter; /**< total times kAnimate was invoked */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b265170cad7..0dd82621fef 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -857,8 +857,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { #if 0 // Used for debugging - Common::String debugMsg = kernelFunc.origName + - Common::String::printf("[0x%x]", kernelFuncNr) + + Common::String debugMsg = Common::String::printf("%s [0x%x]", kernelCall.name, kernelCallNr) + Common::String::printf(", %d params: ", argc) + " ("; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index b85281e9c47..7e9dc0ed317 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -411,7 +411,11 @@ void GfxPalette::kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 int memset(&_sysPalette.intensity[0] + fromColor, intensity, toColor - fromColor); if (setPalette) { setOnScreen(); - g_sci->getEngineState()->_throttleTrigger = true; + EngineState *state = g_sci->getEngineState(); + // Call speed throttler from here as well just in case we need it + // At least in kq6 intro the scripts call us in a tight loop for fadein/fadeout + state->speedThrottler(30); + state->_throttleTrigger = true; } }