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;