SCI: calling speed throttler as well from kPalette(setIntensity) if needed - fixes kq6 intro

svn-id: r50794
This commit is contained in:
Martin Kiewitz 2010-07-10 22:27:28 +00:00
parent 5721b75205
commit df6ead5f93
5 changed files with 23 additions and 25 deletions

View File

@ -67,28 +67,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) {
neededSleep = 60; neededSleep = 60;
} }
if (s->_throttleTrigger) { s->speedThrottler(neededSleep);
// 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;
}
return s->r_acc; return s->r_acc;
} }

View File

@ -111,6 +111,21 @@ void EngineState::reset(bool isRestoring) {
scriptGCInterval = GC_INTERVAL; 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) { void EngineState::wait(int16 ticks) {
uint32 time = g_system->getMillis(); uint32 time = g_system->getMillis();
r_acc = make_reg(0, ((long)time - (long)lastWaitTime) * 60 / 1000); r_acc = make_reg(0, ((long)time - (long)lastWaitTime) * 60 / 1000);

View File

@ -106,6 +106,7 @@ public:
uint32 lastWaitTime; /**< The last time the game invoked Wait() */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */
uint32 _screenUpdateTime; /**< The last time the game updated the screen */ uint32 _screenUpdateTime; /**< The last time the game updated the screen */
void speedThrottler(uint32 neededSleep);
void wait(int16 ticks); void wait(int16 ticks);
uint32 _throttleCounter; /**< total times kAnimate was invoked */ uint32 _throttleCounter; /**< total times kAnimate was invoked */

View File

@ -857,8 +857,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) {
#if 0 #if 0
// Used for debugging // Used for debugging
Common::String debugMsg = kernelFunc.origName + Common::String debugMsg = Common::String::printf("%s [0x%x]", kernelCall.name, kernelCallNr) +
Common::String::printf("[0x%x]", kernelFuncNr) +
Common::String::printf(", %d params: ", argc) + Common::String::printf(", %d params: ", argc) +
" ("; " (";

View File

@ -411,7 +411,11 @@ void GfxPalette::kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 int
memset(&_sysPalette.intensity[0] + fromColor, intensity, toColor - fromColor); memset(&_sysPalette.intensity[0] + fromColor, intensity, toColor - fromColor);
if (setPalette) { if (setPalette) {
setOnScreen(); 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;
} }
} }