From 64aa291a1684e6d7feeb33c1a16687c36d396205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Andersson?= <eriktorbjorn@users.sourceforge.net> Date: Thu, 31 Aug 2006 17:17:31 +0000 Subject: [PATCH] Applied my own patch #1549054, after discussing it with LordHoto. This makes the intro scrolling use constant time, rather than assuming that the screen can be rendered once every "tick". On my^H^Hslow computers, this makes it a bit less smooth, but that should be ok. It also fixes a tiny glitch right after the scrolling. svn-id: r23811 --- NEWS | 5 ++++ engines/kyra/sequences_v1.cpp | 53 +++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/NEWS b/NEWS index 5876eb4b56c..37f4ea6dd41 100644 --- a/NEWS +++ b/NEWS @@ -41,6 +41,11 @@ For a more comprehensive changelog for the latest experimental SVN code, see: Broken Sword 2: - More robust handling of the optional startup.inf file. + Kyrandia: + - Scrolling in the Kyrandia intro is less CPU intensive, at the cost of + not being as smooth as before. + - Fixed a tiny graphics glitch in the Kyrandia intro. + PSP Port: - Fixed crashes during scrolling scenes in certain SCUMM games. - Added saving of thumbnail in SCUMM savegames. diff --git a/engines/kyra/sequences_v1.cpp b/engines/kyra/sequences_v1.cpp index d89bb1291be..31f4ffc8531 100644 --- a/engines/kyra/sequences_v1.cpp +++ b/engines/kyra/sequences_v1.cpp @@ -151,33 +151,38 @@ void KyraEngine::seq_introLogos() { if (_quitFlag) return; - int y1 = 8; - int h1 = 175; - int y2 = 176; - int h2 = 0; - int32 start, now; - int wait; - _screen->copyRegion(0, 91, 0, 8, 320, 103, 6, 2); - _screen->copyRegion(0, 0, 0, 111, 320, 64, 6, 2); + _screen->copyRegion(0, 91, 0, 8, 320, 104, 6, 2); + _screen->copyRegion(0, 0, 0, 112, 320, 64, 6, 2); + + uint32 start = _system->getMillis(); + bool doneFlag = false; + int oldDistance = 0; + do { - start = (int32)_system->getMillis(); - if (h1 > 0) { + uint32 now = _system->getMillis(); + + // The smallest y2 we ever draw the screen for is 65. + int distance = (now - start) / _tickLength; + if (distance > 112) { + distance = 112; + doneFlag = true; + } + + if (distance > oldDistance) { + int y1 = 8 + distance; + int h1 = 168 - distance; + int y2 = 176 - distance; + int h2 = distance; + _screen->copyRegion(0, y1, 0, 8, 320, h1, 2, 0); + if (h2 > 0) + _screen->copyRegion(0, 64, 0, y2, 320, h2, 4, 0); + _screen->updateScreen(); } - ++y1; - --h1; - if (h2 > 0) { - _screen->copyRegion(0, 64, 0, y2, 320, h2, 4, 0); - } - --y2; - ++h2; - _screen->updateScreen(); - now = (int32)_system->getMillis(); - wait = _tickLength - (now - start); - if (wait > 0) { - delay(wait); - } - } while (y2 >= 64 && !_quitFlag && !_abortIntroFlag); + + oldDistance = distance; + delay(10); + } while (!doneFlag && !_quitFlag && !_abortIntroFlag); if (_quitFlag) return;