[Scummvm-cvs-logs] SF.net SVN: scummvm:[41398] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Tue Jun 9 13:26:16 CEST 2009


Revision: 41398
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41398&view=rev
Author:   lordhoto
Date:     2009-06-09 11:26:15 +0000 (Tue, 09 Jun 2009)

Log Message:
-----------
- Moved Screen_v2::copyWsaRect to Screen::copyWsaRect
- Made WSAMovie_v1::displayFrame code match the original
- Changed WSAMovieAmiga::displayFrame to use Screen::copyWsaRect too
- Got rid of '...' parameter usage in all WSA player classes

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/animator_mr.cpp
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/gui_hof.cpp
    scummvm/trunk/engines/kyra/gui_lol.cpp
    scummvm/trunk/engines/kyra/gui_mr.cpp
    scummvm/trunk/engines/kyra/kyra_hof.cpp
    scummvm/trunk/engines/kyra/kyra_mr.cpp
    scummvm/trunk/engines/kyra/lol.cpp
    scummvm/trunk/engines/kyra/scene_lol.cpp
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h
    scummvm/trunk/engines/kyra/screen_v2.cpp
    scummvm/trunk/engines/kyra/screen_v2.h
    scummvm/trunk/engines/kyra/script_lok.cpp
    scummvm/trunk/engines/kyra/script_lol.cpp
    scummvm/trunk/engines/kyra/script_tim.cpp
    scummvm/trunk/engines/kyra/seqplayer.cpp
    scummvm/trunk/engines/kyra/sequences_hof.cpp
    scummvm/trunk/engines/kyra/sequences_lok.cpp
    scummvm/trunk/engines/kyra/sequences_lol.cpp
    scummvm/trunk/engines/kyra/text_mr.cpp
    scummvm/trunk/engines/kyra/wsamovie.cpp
    scummvm/trunk/engines/kyra/wsamovie.h

Modified: scummvm/trunk/engines/kyra/animator_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator_mr.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/animator_mr.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -119,7 +119,7 @@
 				flags |= 0x8000;
 			x = obj->xPos2 - _sceneAnimMovie[obj->animNum]->xAdd();
 			y = obj->yPos2 - _sceneAnimMovie[obj->animNum]->yAdd();
-			_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, 2, x, y, flags | layer);
+			_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, 2, x, y, flags | layer, 0, 0);
 		}
 	}
 }

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/gui.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -404,7 +404,7 @@
 		if (now > _nextUpdate) {
 			_nextUpdate = now + _anim.delay * _vm->tickLength();
 
-			_anim.anim->displayFrame(_animIntern.curFrame, 0, 0, 0);
+			_anim.anim->displayFrame(_animIntern.curFrame, 0, 0, 0, 0, 0, 0);
 			_animIntern.curFrame += _animIntern.direction ;
 			if (_animIntern.curFrame < _anim.startFrame) {
 				_animIntern.curFrame = _anim.startFrame;

Modified: scummvm/trunk/engines/kyra/gui_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_hof.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/gui_hof.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -272,7 +272,7 @@
 }
 
 void KyraEngine_HoF::scrollInventoryWheel() {
-	WSAMovie_v2 movie(this, _screen);
+	WSAMovie_v2 movie(this);
 	movie.open("INVWHEEL.WSA", 0, 0);
 	int frames = movie.opened() ? movie.frames() : 6;
 	memcpy(_screenBuffer, _screen->getCPagePtr(2), 64000);
@@ -287,7 +287,7 @@
 	for (int i = 0; i <= 6 && !breakFlag; ++i) {
 		if (movie.opened()) {
 			_screen->hideMouse();
-			movie.displayFrame(i % frames, 0, 0, 0, 0);
+			movie.displayFrame(i % frames, 0, 0, 0, 0, 0, 0);
 			_screen->showMouse();
 			_screen->updateScreen();
 		}

Modified: scummvm/trunk/engines/kyra/gui_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/gui_lol.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -1364,7 +1364,7 @@
 		(_itemsInPlay[hItem].itemPropertyIndex == 220 || _itemsInPlay[slotItem].itemPropertyIndex == 220)) {
 		// merge ruby of truth
 
-		WSAMovie_v2 *wsa = new WSAMovie_v2(this, _screen);
+		WSAMovie_v2 *wsa = new WSAMovie_v2(this);
 		wsa->open("truth.wsa", 0, 0);
 
 		_screen->hideMouse();
@@ -1377,7 +1377,7 @@
 		for (int i = 0; i < 25; i++) {
 			uint32 delayTimer = _system->getMillis() + 7 * _tickLength;
 			_screen->copyRegion(button->x, button->y - 3, 0, 0, 25, 27, 2, 2);
-			wsa->displayFrame(i, 2, 0, 0, 0x4000);
+			wsa->displayFrame(i, 2, 0, 0, 0x4000, 0, 0);
 			_screen->copyRegion(0, 0, button->x, button->y - 3, 25, 27, 2, 0);
 			_screen->updateScreen();
 			delayUntil(delayTimer);

Modified: scummvm/trunk/engines/kyra/gui_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/gui_mr.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -352,10 +352,10 @@
 		frame = 13;
 
 	if (page == 0) {
-		_invWsa->displayFrame(frame, 0, 0, 0, 0);
+		_invWsa->displayFrame(frame, 0, 0, 0, 0, 0, 0);
 		_screen->updateScreen();
 	} else if (page == 30) {
-		_invWsa->displayFrame(frame, 2, 0, -144, 0);
+		_invWsa->displayFrame(frame, 2, 0, -144, 0, 0, 0);
 	}
 
 	_invWsaFrame = frame;
@@ -685,10 +685,10 @@
 	loadAlbumPageWSA();
 
 	if (_album.leftPage.wsa->opened())
-		_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000);
+		_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000, 0, 0);
 
 	if (_album.rightPage.wsa->opened())
-		_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000);
+		_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000, 0, 0);
 
 	printAlbumPageText();
 	_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
@@ -843,10 +843,10 @@
 			loadAlbumPageWSA();
 
 			if (_album.leftPage.wsa->opened())
-				_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000);
+				_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000, 0, 0);
 
 			if (_album.rightPage.wsa->opened())
-				_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000);
+				_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000, 0, 0);
 
 			printAlbumPageText();
 
@@ -899,7 +899,7 @@
 
 	nextRun = _album.leftPage.timer + 5 * _tickLength;
 	if (nextRun < _system->getMillis() && _album.leftPage.wsa->opened()) {
-		_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000);
+		_album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 2, _albumWSAX[_album.nextPage+0], _albumWSAY[_album.nextPage+0], 0x4000, 0, 0);
 		_screen->copyRegion(40, 17, 40, 17, 87, 73, 2, 0, Screen::CR_NO_P_CHECK);
 
 		++_album.leftPage.curFrame;
@@ -918,7 +918,7 @@
 
 	nextRun = _album.rightPage.timer + 5 * _tickLength;
 	if (nextRun < _system->getMillis() && _album.rightPage.wsa->opened()) {
-		_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000);
+		_album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 2, _albumWSAX[_album.nextPage+1], _albumWSAY[_album.nextPage+1], 0x4000, 0, 0);
 		_screen->copyRegion(194, 20, 194, 20, 85, 69, 2, 0, Screen::CR_NO_P_CHECK);
 
 		++_album.rightPage.curFrame;
@@ -936,13 +936,13 @@
 void KyraEngine_MR::albumAnim1() {
 	for (int i = 6; i >= 3; --i) {
 		albumRestoreRect();
-		_album.wsa->displayFrame(i, 2, -100, 90, 0x4000);
+		_album.wsa->displayFrame(i, 2, -100, 90, 0x4000, 0, 0);
 		albumUpdateRect();
 		delayWithTicks(1);
 	}
 
 	albumRestoreRect();
-	_album.wsa->displayFrame(14, 2, -100, 90, 0x4000);
+	_album.wsa->displayFrame(14, 2, -100, 90, 0x4000, 0, 0);
 	albumUpdateRect();
 	delayWithTicks(1);
 }
@@ -950,7 +950,7 @@
 void KyraEngine_MR::albumAnim2() {
 	for (int i = 3; i <= 6; ++i) {
 		albumRestoreRect();
-		_album.wsa->displayFrame(i, 2, -100, 90, 0x4000);
+		_album.wsa->displayFrame(i, 2, -100, 90, 0x4000, 0, 0);
 		albumUpdateRect();
 		delayWithTicks(1);
 	}

Modified: scummvm/trunk/engines/kyra/kyra_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_hof.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/kyra_hof.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -381,10 +381,10 @@
 
 	memset(_sceneAnims, 0, sizeof(_sceneAnims));
 	for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
-		_sceneAnimMovie[i] = new WSAMovie_v2(this, _screen);
+		_sceneAnimMovie[i] = new WSAMovie_v2(this);
 	memset(_wsaSlots, 0, sizeof(_wsaSlots));
 	for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i)
-		_wsaSlots[i] = new WSAMovie_v2(this, _screen);
+		_wsaSlots[i] = new WSAMovie_v2(this);
 
 	_screen->_curPage = 0;
 
@@ -1550,7 +1550,7 @@
 		wsaFlags |= 2;
 
 	if (!_invWsa.wsa)
-		_invWsa.wsa = new WSAMovie_v2(this, _screen);
+		_invWsa.wsa = new WSAMovie_v2(this);
 
 	if (!_invWsa.wsa->open(filename, wsaFlags, 0))
 		error("Couldn't open inventory WSA file '%s'", filename);

Modified: scummvm/trunk/engines/kyra/kyra_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_mr.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/kyra_mr.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -274,14 +274,14 @@
 
 		for (int i = 0; i < 64 && !shouldQuit(); ++i) {
 			uint32 nextRun = _system->getMillis() + 3 * _tickLength;
-			_menuAnim->displayFrame(i, 0, 0, 0, 0);
+			_menuAnim->displayFrame(i, 0, 0, 0, 0, 0, 0);
 			_screen->updateScreen();
 			delayUntil(nextRun);
 		}
 
 		for (int i = 64; i > 29 && !shouldQuit(); --i) {
 			uint32 nextRun = _system->getMillis() + 3 * _tickLength;
-			_menuAnim->displayFrame(i, 0, 0, 0, 0);
+			_menuAnim->displayFrame(i, 0, 0, 0, 0, 0, 0);
 			_screen->updateScreen();
 			delayUntil(nextRun);
 		}
@@ -327,7 +327,7 @@
 }
 
 void KyraEngine_MR::initMainMenu() {
-	_menuAnim = new WSAMovie_v2(this, _screen);
+	_menuAnim = new WSAMovie_v2(this);
 	_menuAnim->open("REVENGE.WSA", 1, _screen->getPalette(0));
 	memset(_screen->getPalette(0), 0, 3);
 
@@ -541,11 +541,11 @@
 }
 
 void KyraEngine_MR::startup() {
-	_album.wsa = new WSAMovie_v2(this, _screen);
+	_album.wsa = new WSAMovie_v2(this);
 	assert(_album.wsa);
-	_album.leftPage.wsa = new WSAMovie_v2(this, _screen);
+	_album.leftPage.wsa = new WSAMovie_v2(this);
 	assert(_album.leftPage.wsa);
-	_album.rightPage.wsa = new WSAMovie_v2(this, _screen);
+	_album.rightPage.wsa = new WSAMovie_v2(this);
 	assert(_album.rightPage.wsa);
 	musicUpdate(0);
 
@@ -598,7 +598,7 @@
 
 	for (int i = 0; i < 16; ++i) {
 		_sceneAnims[i].flags = 0;
-		_sceneAnimMovie[i] = new WSAMovie_v2(this, _screen);
+		_sceneAnimMovie[i] = new WSAMovie_v2(this);
 		assert(_sceneAnimMovie[i]);
 	}
 
@@ -655,7 +655,7 @@
 	musicUpdate(0);
 	runStartupScript(1, 0);
 	_res->exists("MOODOMTR.WSA", true);
-	_invWsa = new WSAMovie_v2(this, _screen);
+	_invWsa = new WSAMovie_v2(this);
 	assert(_invWsa);
 	_invWsa->open("MOODOMTR.WSA", 1, 0);
 	_invWsaFrame = 6;

Modified: scummvm/trunk/engines/kyra/lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/lol.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/lol.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -1919,7 +1919,7 @@
 }
 
 int LoLEngine::processMagicSpark(int charNum, int spellLevel) {
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	_screen->copyPage(0, 12);
 
 	mov->open("spark1.wsa", 0, 0);
@@ -2156,7 +2156,7 @@
 
 	int sX = 112;
 	int sY = 0;
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 
 	if (spellLevel == 0) {
 		sX = 0;
@@ -2417,7 +2417,7 @@
 	int cp = _screen->setCurPage(2);
 	_screen->copyPage(0, 12);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	mov->open("hand.wsa", 1, 0);
 	if (!mov->opened())
 		error("Hand: Unable to load HAND.WSA");
@@ -2509,7 +2509,7 @@
 
 	char wsafile[13];
 	snprintf(wsafile, 13, "mists%0d.wsa", spellLevel + 1);
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	mov->open(wsafile, 1, 0);
 	if (!mov->opened())
 		error("Mist: Unable to load mists.wsa");
@@ -2541,7 +2541,7 @@
 
 	char wsafile[13];
 	snprintf(wsafile, 13, "litning%d.wsa", spellLevel + 1);
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	mov->open(wsafile, 1, 0);
 	if (!mov->opened())
 		error("Litning: Unable to load litning.wsa");
@@ -2570,7 +2570,7 @@
 	int cp = _screen->setCurPage(2);
 	_screen->copyPage(0, 12);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	int numFrames = mov->open("fog.wsa", 0, 0);
 	if (!mov->opened())
 		error("Fog: Unable to load fog.wsa");
@@ -2646,7 +2646,7 @@
 		_monsters[destIds[i]].fightCurTick = destTicks[i];
 	}
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 
 	mov->open("swarm.wsa", 0, 0);
 	if (!mov->opened())
@@ -2734,7 +2734,7 @@
 	_screen->copyPage(0, 2);
 	_screen->copyPage(2, 12);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	mov->open("guardian.wsa", 0, 0);
 	if (!mov->opened())
 		error("Guardian: Unable to load guardian.wsa");
@@ -2871,7 +2871,7 @@
 	snd_playSoundEffect(_updateSpellBookAnimData[(spell << 2) + 3], -1);
 	snd_playSoundEffect(95, -1);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 
 	mov->open("getspell.wsa", 0, 0);
 	if (!mov->opened())
@@ -3529,7 +3529,7 @@
 	_screen->copyPage(0, 12);
 	snd_playSoundEffect(148, -1);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	int numFrames = mov->open("viper.wsa", 1, 0);
 	if (!mov->opened())
 		error("Viper: Unable to load viper.wsa");
@@ -3579,7 +3579,7 @@
 	gui_drawScene(2);
 	_screen->copyPage(2, 10);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	int numFrames = mov->open("shatter.wsa", 1, 0);
 	if (!mov->opened())
 		error("Shatter: Unable to load shatter.wsa");

Modified: scummvm/trunk/engines/kyra/scene_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene_lol.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/scene_lol.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -1312,7 +1312,7 @@
 	uint8 *p2 = _screen->getPalette(3);
 
 	if (dist) {
-		WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+		WSAMovie_v2 *mov = new WSAMovie_v2(this);
 		char file[13];
 		snprintf(file, 13, "gasexp%0d.wsa", dist);
 		mov->open(file, 1, 0);

Modified: scummvm/trunk/engines/kyra/screen.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/screen.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -339,6 +339,148 @@
 	clearOverlayPage(_curPage);
 }
 
+void Screen::copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
+						int unk1, const uint8 *unkPtr1, const uint8 *unkPtr2) {
+	uint8 *dstPtr = getPagePtr(_curPage);
+	uint8 *origDst = dstPtr;
+
+	const ScreenDim *dim = getScreenDim(dimState);
+	int dimX1 = dim->sx << 3;
+	int dimX2 = dim->w << 3;
+	dimX2 += dimX1;
+
+	int dimY1 = dim->sy;
+	int dimY2 = dim->h;
+	dimY2 += dimY1;
+
+	int temp = y - dimY1;
+	if (temp < 0) {
+		if ((temp += h) <= 0)
+			return;
+		else {
+			SWAP(temp, h);
+			y += temp - h;
+			src += (temp - h) * w;
+		}
+	}
+
+	temp = dimY2 - y;
+	if (temp <= 0)
+		return;
+
+	if (temp < h)
+		h = temp;
+
+	int srcOffset = 0;
+	temp = x - dimX1;
+	if (temp < 0) {
+		temp = -temp;
+		srcOffset = temp;
+		x += temp;
+		w -= temp;
+	}
+
+	int srcAdd = 0;
+
+	temp = dimX2 - x;
+	if (temp <= 0)
+		return;
+
+	if (temp < w) {
+		SWAP(w, temp);
+		temp -= w;
+		srcAdd = temp;
+	}
+
+	dstPtr += y * SCREEN_W + x;
+	uint8 *dst = dstPtr;
+
+	if (_curPage == 0 || _curPage == 1)
+		addDirtyRect(x, y, w, h);
+
+	clearOverlayRect(_curPage, x, y, w, h);
+
+	temp = h;
+	int curY = y;
+	while (h--) {
+		src += srcOffset;
+		++curY;
+		int cW = w;
+
+		switch (plotFunc) {
+		case 0:
+			memcpy(dst, src, cW);
+			dst += cW; src += cW;
+			break;
+
+		case 1:
+			while (cW--) {
+				uint8 d = *src++;
+				uint8 t = unkPtr1[d];
+				if (t != 0xFF)
+					d = unkPtr2[*dst + (t << 8)];
+				*dst++ = d;
+			}
+			break;
+
+		case 4:
+			while (cW--) {
+				uint8 d = *src++;
+				if (d)
+					*dst = d;
+				++dst;
+			}
+			break;
+
+		case 5:
+			while (cW--) {
+				uint8 d = *src++;
+				if (d) {
+					uint8 t = unkPtr1[d];
+					if (t != 0xFF)
+						d = unkPtr2[*dst + (t << 8)];
+					*dst = d;
+				}
+				++dst;
+			}
+			break;
+
+		case 8:
+		case 9:
+			while (cW--) {
+				uint8 d = *src++;
+				uint8 t = _shapePages[0][dst - origDst] & 7;
+				if (unk1 < t && (curY > _maskMinY && curY < _maskMaxY))
+					d = _shapePages[1][dst - origDst];
+				*dst++ = d;
+			}
+			break;
+
+		case 12:
+		case 13:
+			while (cW--) {
+				uint8 d = *src++;
+				if (d) {
+					uint8 t = _shapePages[0][dst - origDst] & 7;
+					if (unk1 < t && (curY > _maskMinY && curY < _maskMaxY))
+						d = _shapePages[1][dst - origDst];
+					*dst++ = d;
+				} else {
+					d = _shapePages[1][dst - origDst];
+					*dst++ = d;
+				}
+			}
+			break;
+
+		default:
+			break;
+		}
+
+		dst = (dstPtr += SCREEN_W);
+		src += srcAdd;
+	}
+}
+
 uint8 Screen::getPagePixel(int pageNum, int x, int y) {
 	assert(pageNum < SCREEN_PAGE_NUM);
 	assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H);

Modified: scummvm/trunk/engines/kyra/screen.h
===================================================================
--- scummvm/trunk/engines/kyra/screen.h	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/screen.h	2009-06-09 11:26:15 UTC (rev 41398)
@@ -112,6 +112,9 @@
 	int setCurPage(int pageNum);
 	void clearCurPage();
 
+	void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
+					int unk1, const uint8 *unkPtr1, const uint8 *unkPtr2);
+
 	// page 0 functions
 	void copyToPage0(int y, int h, uint8 page, uint8 *seqBuf);
 	void shakeScreen(int times);

Modified: scummvm/trunk/engines/kyra/screen_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen_v2.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/screen_v2.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -137,148 +137,6 @@
 	}
 }
 
-void Screen_v2::copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
-							int unk1, const uint8 *unkPtr1, const uint8 *unkPtr2) {
-	uint8 *dstPtr = getPagePtr(_curPage);
-	uint8 *origDst = dstPtr;
-
-	const ScreenDim *dim = getScreenDim(dimState);
-	int dimX1 = dim->sx << 3;
-	int dimX2 = dim->w << 3;
-	dimX2 += dimX1;
-
-	int dimY1 = dim->sy;
-	int dimY2 = dim->h;
-	dimY2 += dimY1;
-
-	int temp = y - dimY1;
-	if (temp < 0) {
-		if ((temp += h) <= 0)
-			return;
-		else {
-			SWAP(temp, h);
-			y += temp - h;
-			src += (temp - h) * w;
-		}
-	}
-
-	temp = dimY2 - y;
-	if (temp <= 0)
-		return;
-
-	if (temp < h)
-		h = temp;
-
-	int srcOffset = 0;
-	temp = x - dimX1;
-	if (temp < 0) {
-		temp = -temp;
-		srcOffset = temp;
-		x += temp;
-		w -= temp;
-	}
-
-	int srcAdd = 0;
-
-	temp = dimX2 - x;
-	if (temp <= 0)
-		return;
-
-	if (temp < w) {
-		SWAP(w, temp);
-		temp -= w;
-		srcAdd = temp;
-	}
-
-	dstPtr += y * SCREEN_W + x;
-	uint8 *dst = dstPtr;
-
-	if (_curPage == 0 || _curPage == 1)
-		addDirtyRect(x, y, w, h);
-
-	clearOverlayRect(_curPage, x, y, w, h);
-
-	temp = h;
-	int curY = y;
-	while (h--) {
-		src += srcOffset;
-		++curY;
-		int cW = w;
-
-		switch (plotFunc) {
-		case 0:
-			memcpy(dst, src, cW);
-			dst += cW; src += cW;
-			break;
-
-		case 1:
-			while (cW--) {
-				uint8 d = *src++;
-				uint8 t = unkPtr1[d];
-				if (t != 0xFF)
-					d = unkPtr2[*dst + (t << 8)];
-				*dst++ = d;
-			}
-			break;
-
-		case 4:
-			while (cW--) {
-				uint8 d = *src++;
-				if (d)
-					*dst = d;
-				++dst;
-			}
-			break;
-
-		case 5:
-			while (cW--) {
-				uint8 d = *src++;
-				if (d) {
-					uint8 t = unkPtr1[d];
-					if (t != 0xFF)
-						d = unkPtr2[*dst + (t << 8)];
-					*dst = d;
-				}
-				++dst;
-			}
-			break;
-
-		case 8:
-		case 9:
-			while (cW--) {
-				uint8 d = *src++;
-				uint8 t = _shapePages[0][dst - origDst] & 7;
-				if (unk1 < t && (curY > _maskMinY && curY < _maskMaxY))
-					d = _shapePages[1][dst - origDst];
-				*dst++ = d;
-			}
-			break;
-
-		case 12:
-		case 13:
-			while (cW--) {
-				uint8 d = *src++;
-				if (d) {
-					uint8 t = _shapePages[0][dst - origDst] & 7;
-					if (unk1 < t && (curY > _maskMinY && curY < _maskMaxY))
-						d = _shapePages[1][dst - origDst];
-					*dst++ = d;
-				} else {
-					d = _shapePages[1][dst - origDst];
-					*dst++ = d;
-				}
-			}
-			break;
-
-		default:
-			break;
-		}
-
-		dst = (dstPtr += SCREEN_W);
-		src += srcAdd;
-	}
-}
-
 const uint8 *Screen_v2::getPtrToShape(const uint8 *shpFile, int shape) {
 	uint16 shapes = READ_LE_UINT16(shpFile);
 

Modified: scummvm/trunk/engines/kyra/screen_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/screen_v2.h	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/screen_v2.h	2009-06-09 11:26:15 UTC (rev 41398)
@@ -37,9 +37,6 @@
 	~Screen_v2();
 
 	// screen page handling
-	void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
-					int unk1, const uint8 *unkPtr1, const uint8 *unkPtr2);
-
 	void checkedPageUpdate(int srcPage, int dstPage);
 
 	// palette handling

Modified: scummvm/trunk/engines/kyra/script_lok.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_lok.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/script_lok.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -427,7 +427,7 @@
 	int wsaFrame = 0;
 
 	while (running) {
-		_movieObjects[wsaIndex]->displayFrame(wsaFrame++, 0, xpos, ypos);
+		_movieObjects[wsaIndex]->displayFrame(wsaFrame++, 0, xpos, ypos, 0, 0, 0);
 		_animator->_updateScreen = true;
 		if (wsaFrame >= _movieObjects[wsaIndex]->frames())
 			running = false;
@@ -458,7 +458,7 @@
 	int waitTime = stackPos(3);
 	int wsaIndex = stackPos(4);
 	_screen->hideMouse();
-	_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos);
+	_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
 	_animator->_updateScreen = true;
 	uint32 continueTime = waitTime * _tickLength + _system->getMillis();
 	while (_system->getMillis() < continueTime) {
@@ -500,7 +500,7 @@
 	_screen->hideMouse();
 	for (; startFrame <= endFrame; ++startFrame) {
 		uint32 nextRun = _system->getMillis() + delayTime * _tickLength;
-		_movieObjects[wsaIndex]->displayFrame(startFrame, 0, xpos, ypos);
+		_movieObjects[wsaIndex]->displayFrame(startFrame, 0, xpos, ypos, 0, 0, 0);
 		_animator->_updateScreen = true;
 		while (_system->getMillis() < nextRun) {
 			_sprites->updateSceneAnims();
@@ -682,7 +682,7 @@
 
 	_screen->hideMouse();
 	uint32 continueTime = waitTime * _tickLength + _system->getMillis();
-	_movieObjects[wsaIndex]->displayFrame(frame, 2, xpos, ypos);
+	_movieObjects[wsaIndex]->displayFrame(frame, 2, xpos, ypos, 0, 0, 0);
 	_animator->_updateScreen = true;
 	while (_system->getMillis() < continueTime) {
 		_sprites->updateSceneAnims();
@@ -753,7 +753,7 @@
 	// what shouldn't happen. So we're not updating the screen for this special
 	// case too.
 	if (startFrame == 18 && endFrame == 18 && _currentRoom == 45) {
-		_movieObjects[wsaIndex]->displayFrame(18, 0, xpos, ypos);
+		_movieObjects[wsaIndex]->displayFrame(18, 0, xpos, ypos, 0, 0, 0);
 		delay(waitTime * _tickLength);
 		return 0;
 	}
@@ -765,7 +765,7 @@
 			int frame = startFrame;
 			while (endFrame >= frame) {
 				uint32 continueTime = waitTime * _tickLength + _system->getMillis();
-				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos);
+				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
 				if (waitTime)
 					_animator->_updateScreen = true;
 				while (_system->getMillis() < continueTime) {
@@ -783,7 +783,7 @@
 			int frame = startFrame;
 			while (endFrame <= frame) {
 				uint32 continueTime = waitTime * _tickLength + _system->getMillis();
-				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos);
+				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
 				if (waitTime)
 					_animator->_updateScreen = true;
 				while (_system->getMillis() < continueTime) {
@@ -1276,7 +1276,7 @@
 			if (code == 14)
 				snd_playSoundEffect(0x73);
 
-			amulet.displayFrame(code, 0, 224, 152);
+			amulet.displayFrame(code, 0, 224, 152, 0, 0, 0);
 			_animator->_updateScreen = true;
 
 			while (_system->getMillis() < nextTime) {

Modified: scummvm/trunk/engines/kyra/script_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_lol.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/script_lol.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -2126,7 +2126,7 @@
 int LoLEngine::olol_restoreMagicShroud(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreMagicShroud(%p)", (const void *)script);
 
-	WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *mov = new WSAMovie_v2(this);
 	mov->open("DARKLITE.WSA", 2, 0);
 	if (!mov->opened())
 		return 0;
@@ -2148,7 +2148,7 @@
 
 	for (int i = 0; i < 21; i++) {
 		uint32 etime = _system->getMillis() + 20 * _tickLength;
-		mov->displayFrame(i, 0, 0, 0, 0);
+		mov->displayFrame(i, 0, 0, 0, 0, 0, 0);
 		_screen->updateScreen();
 		_screen->setScreenPalette(tpal3);
 		tpal3 += 768;
@@ -2163,7 +2163,7 @@
 
 	for (int i = 22; i < 38; i++) {
 		uint32 etime = _system->getMillis() + 12 * _tickLength;
-		mov->displayFrame(i, 0, 0, 0, 0);
+		mov->displayFrame(i, 0, 0, 0, 0, 0, 0);
 		_screen->updateScreen();
 		if (i == 22 || i == 24 || i == 28 || i == 32) {
 			snd_playSoundEffect(131, -1);
@@ -2566,7 +2566,7 @@
 	if (param[1] == 0xFFFF) {
 		_screen->copyRegion(0, 0, 0, 0, 320, 200, 0, 2, Screen::CR_NO_P_CHECK);
 	} else {
-		anim->wsa->displayFrame(param[1], 2, anim->x, anim->y, 0);
+		anim->wsa->displayFrame(param[1], 2, anim->x, anim->y, 0, 0, 0);
 		_screen->copyRegion(anim->wsa->xAdd(), anim->wsa->yAdd(), anim->wsa->xAdd(), anim->wsa->yAdd(), anim->wsa->width(), anim->wsa->height(), 2, 0);
 	}
 

Modified: scummvm/trunk/engines/kyra/script_tim.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_tim.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/script_tim.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -471,7 +471,7 @@
 		if (isLoLDemo)
 			anim->wsa = new WSAMovie_v1(_vm);
 		else
-			anim->wsa = new WSAMovie_v2(_vm, _screen);
+			anim->wsa = new WSAMovie_v2(_vm);
 		assert(anim->wsa);
 
 		anim->wsa->open(file, wsaOpenFlags, (index == 1) ? _screen->getPalette(0) : 0);
@@ -518,7 +518,7 @@
 				_screen->updateScreen();
 			}
 
-			anim->wsa->displayFrame(0, 0, x, y, 0);
+			anim->wsa->displayFrame(0, 0, x, y, 0, 0, 0);
 		}
 
 		if (wsaFlags & 2)
@@ -941,7 +941,7 @@
 	snprintf(file, 32, "%s.WSA", filename);
 
 	if (_vm->resource()->exists(file)) {
-		anim->wsa = new WSAMovie_v2(_vm, TIMInterpreter::_screen);
+		anim->wsa = new WSAMovie_v2(_vm);
 		assert(anim->wsa);
 		anim->wsa->open(file, wsaOpenFlags, _screen->getPalette(3));
 	}
@@ -955,7 +955,7 @@
 	}
 
 	if (wsaFlags & 7)
-		anim->wsa->displayFrame(0, 0, x, y, 0);
+		anim->wsa->displayFrame(0, 0, x, y, 0, 0, 0);
 
 	if (wsaFlags & 3) {
 		_screen->loadSpecialColors(_screen->getPalette(3));
@@ -1051,7 +1051,7 @@
 
 	// WORKAROUND for some bugged scripts that will try to display frames of non-existent animations
 	if (anim->wsa)
-		anim->wsa->displayFrame(anim->curFrame - 1, 0, anim->x, anim->y, 0);
+		anim->wsa->displayFrame(anim->curFrame - 1, 0, anim->x, anim->y, 0, 0, 0);
 }
 
 void TIMInterpreter_LoL::stopBackgroundAnimation(int animIndex) {
@@ -1110,7 +1110,7 @@
 
 	anim->nextFrame += (anim->frameDelay * _vm->_tickLength);
 
-	anim->wsa->displayFrame(anim->curFrame - 1, 0, anim->x, anim->y, 0);
+	anim->wsa->displayFrame(anim->curFrame - 1, 0, anim->x, anim->y, 0, 0, 0);
 	anim->nextFrame += _system->getMillis();
 }
 
@@ -1126,7 +1126,7 @@
 			_screen->copyRegion(112, 0, 112, 0, 176, 120, 2, 0);
 			_screen->updateScreen();
 		} else {
-			anim->wsa->displayFrame(i - 1, 0, anim->x, anim->y, 0);
+			anim->wsa->displayFrame(i - 1, 0, anim->x, anim->y, 0, 0, 0);
 			_screen->updateScreen();
 		}
 		_vm->delayUntil(next);

Modified: scummvm/trunk/engines/kyra/seqplayer.cpp
===================================================================
--- scummvm/trunk/engines/kyra/seqplayer.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/seqplayer.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -148,7 +148,7 @@
 	_seqMovies[wsaObj].pos.x = READ_LE_UINT16(_seqData); _seqData += 2;
 	_seqMovies[wsaObj].pos.y = *_seqData++;
 	assert(_seqMovies[wsaObj].movie);
-	_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y);
+	_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y, 0, 0, 0);
 	_seqMovies[wsaObj].frame = frame;
 }
 
@@ -160,7 +160,7 @@
 		frame = 0;
 		_seqMovies[wsaObj].frame = 0;
 	}
-	_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y);
+	_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y, 0, 0, 0);
 }
 
 void SeqPlayer::s1_wsaPlayPrevFrame() {
@@ -171,7 +171,7 @@
 		frame = _seqMovies[wsaObj].numFrames;
 		_seqMovies[wsaObj].frame = frame;
 	} else {
-		_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y);
+		_seqMovies[wsaObj].movie->displayFrame(frame, _seqMovies[wsaObj].page, _seqMovies[wsaObj].pos.x, _seqMovies[wsaObj].pos.y, 0, 0, 0);
 	}
 }
 

Modified: scummvm/trunk/engines/kyra/sequences_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sequences_hof.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/sequences_hof.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -102,7 +102,7 @@
 			_seqWsa->close();
 			_seqWsa->open(cseq.wsaFile, 0, _screen->getPalette(0));
 			_screen->setScreenPalette(_screen->getPalette(0));
-			_seqWsa->displayFrame(0, 2, cseq.xPos, cseq.yPos, 0);
+			_seqWsa->displayFrame(0, 2, cseq.xPos, cseq.yPos, 0, 0, 0);
 		}
 
 		if (cseq.flags & 4) {
@@ -174,7 +174,7 @@
 
 				if (_seqWsa) {
 					int f = _seqWsaCurrentFrame % _seqWsa->frames();
-					_seqWsa->displayFrame(f, 2, cseq.xPos, cseq.yPos, 0);
+					_seqWsa->displayFrame(f, 2, cseq.xPos, cseq.yPos, 0, 0, 0);
 				}
 
 				_screen->copyPage(2, 12);
@@ -2201,7 +2201,7 @@
 	NestedSequence s = _sequences->seqn[seqNum];
 
 	if (!_activeWSA[wsaNum].movie) {
-		_activeWSA[wsaNum].movie = new WSAMovie_v2(this, _screen);
+		_activeWSA[wsaNum].movie = new WSAMovie_v2(this);
 		assert(_activeWSA[wsaNum].movie);
 	}
 
@@ -2246,7 +2246,7 @@
 	case 0:
 		xa = -_activeWSA[wsaNum].movie->xAdd();
 		ya = -_activeWSA[wsaNum].movie->yAdd();
-		_activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0);
+		_activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0);
 		seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
 							_activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 2);
 		break;
@@ -2254,7 +2254,7 @@
 	case 1:
 		xa = -_activeWSA[wsaNum].movie->xAdd();
 		ya = -_activeWSA[wsaNum].movie->yAdd();
-		_activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0);
+		_activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0);
 		seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
 							_activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 1);
 		break;
@@ -2263,21 +2263,21 @@
 		seq_waitForTextsTimeout();
 		xa = -_activeWSA[wsaNum].movie->xAdd();
 		ya = -_activeWSA[wsaNum].movie->yAdd();
-		_activeWSA[wsaNum].movie->displayFrame(0x15, 8, xa, ya, 0);
+		_activeWSA[wsaNum].movie->displayFrame(0x15, 8, xa, ya, 0, 0, 0);
 		seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
 							_activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 0, 2);
 		break;
 
 	case 3:
 		_screen->copyPage(2, 10);
-		_activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0);
+		_activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0);
 		_screen->copyPage(2, 12);
 		seq_cmpFadeFrame("scene2.cmp");
 		break;
 
 	case 4:
 		_screen->copyPage(2, 10);
-		_activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0);
+		_activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0);
 		_screen->copyPage(2, 12);
 		seq_cmpFadeFrame("scene3.cmp");
 		break;
@@ -2364,10 +2364,10 @@
 
 	if (_activeWSA[wsaNum].movie) {
 		if (_activeWSA[wsaNum].flags & 0x20) {
-			_activeWSA[wsaNum].movie->displayFrame(_activeWSA[wsaNum].control[currentFrame].index, 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000);
+			_activeWSA[wsaNum].movie->displayFrame(_activeWSA[wsaNum].control[currentFrame].index, 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0);
 			_activeWSA[wsaNum].frameDelay = _activeWSA[wsaNum].control[currentFrame].delay;
 		} else {
-			_activeWSA[wsaNum].movie->displayFrame(currentFrame % _activeWSA[wsaNum].movie->frames(), 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000);
+			_activeWSA[wsaNum].movie->displayFrame(currentFrame % _activeWSA[wsaNum].movie->frames(), 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0);
 		}
 	}
 
@@ -2477,7 +2477,7 @@
 
 		_seqWsaChatFrameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
 		if (wsa)
-			wsa->displayFrame(curframe % wsa->frames(), 2, wsaXpos, wsaYpos, 0);
+			wsa->displayFrame(curframe % wsa->frames(), 2, wsaXpos, wsaYpos, 0, 0, 0);
 
 		_screen->copyPage(2, 12);
 
@@ -2721,7 +2721,7 @@
 }
 
 void KyraEngine_HoF::seq_showStarcraftLogo() {
-	WSAMovie_v2 *ci = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *ci = new WSAMovie_v2(this);
 	assert(ci);
 	_screen->clearPage(2);
 	_res->loadPakFile("INTROGEN.PAK");
@@ -2732,21 +2732,21 @@
 		return;
 	}
 	_screen->hideMouse();
-	ci->displayFrame(0, 2, 0, 0, 0);
+	ci->displayFrame(0, 2, 0, 0, 0, 0, 0);
 	_screen->copyPage(2, 0);
 	_screen->fadeFromBlack();
 	for (int i = 1; i < endframe; i++) {
 		_seqEndTime = _system->getMillis() + 50;
 		if (skipFlag())
 			break;
-		ci->displayFrame(i, 2, 0, 0, 0);
+		ci->displayFrame(i, 2, 0, 0, 0, 0, 0);
 		_screen->copyPage(2, 0);
 		_screen->updateScreen();
 		delay(_seqEndTime - _system->getMillis());
 	}
 	if (!skipFlag()) {
 		_seqEndTime = _system->getMillis() + 50;
-		ci->displayFrame(0, 2, 0, 0, 0);
+		ci->displayFrame(0, 2, 0, 0, 0, 0, 0);
 		_screen->copyPage(2, 0);
 		_screen->updateScreen();
 		delay(_seqEndTime - _system->getMillis());
@@ -2760,7 +2760,7 @@
 
 void KyraEngine_HoF::seq_init() {
 	_seqProcessedString = new char[200];
-	_seqWsa = new WSAMovie_v2(this, _screen);
+	_seqWsa = new WSAMovie_v2(this);
 	_activeWSA = new ActiveWSA[8];
 	_activeText = new ActiveText[10];
 

Modified: scummvm/trunk/engines/kyra/sequences_lok.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sequences_lok.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/sequences_lok.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -966,7 +966,7 @@
 				else if (i == 20)
 					snd_playSoundEffect(0x0E);
 				nextTime = _system->getMillis() + 8 * _tickLength;
-				_finalA->displayFrame(i, 0, 8, 8);
+				_finalA->displayFrame(i, 0, 8, 8, 0, 0, 0);
 				_screen->updateScreen();
 			}
 			delete _finalA;
@@ -1198,7 +1198,7 @@
 
 	case 2:
 		if (_system->getMillis() >= timer2) {
-			_finalA->displayFrame(frame, 0, 8, 46);
+			_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 			_screen->updateScreen();
 			timer2 = _system->getMillis() + 8 * _tickLength;
 			++frame;
@@ -1213,7 +1213,7 @@
 		if (_system->getMillis() < timer1) {
 			if (_system->getMillis() >= timer2) {
 				frame = _rnd.getRandomNumberRng(14, 17);
-				_finalA->displayFrame(frame, 0, 8, 46);
+				_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 				_screen->updateScreen();
 				timer2 = _system->getMillis() + 8 * _tickLength;
 			}
@@ -1225,7 +1225,7 @@
 
 	case 4:
 		if (_system->getMillis() >= timer2) {
-			_finalA->displayFrame(frame, 0, 8, 46);
+			_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 			_screen->updateScreen();
 			timer2 = _system->getMillis() + 8 * _tickLength;
 			++frame;
@@ -1239,7 +1239,7 @@
 
 	case 5:
 		if (_system->getMillis() >= timer2) {
-			_finalA->displayFrame(frame, 0, 8, 46);
+			_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 			_screen->updateScreen();
 			timer2 = _system->getMillis() + 8 * _tickLength;
 			++frame;
@@ -1253,7 +1253,7 @@
 	case 6:
 		if (_unkEndSeqVar4) {
 			if (frame <= 33 && _system->getMillis() >= timer2) {
-				_finalA->displayFrame(frame, 0, 8, 46);
+				_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 				_screen->updateScreen();
 				timer2 = _system->getMillis() + 8 * _tickLength;
 				++frame;
@@ -1278,7 +1278,7 @@
 
 	case 8:
 		if (_system->getMillis() >= timer2) {
-			_finalA->displayFrame(frame, 0, 8, 46);
+			_finalA->displayFrame(frame, 0, 8, 46, 0, 0, 0);
 			_screen->updateScreen();
 			timer2 = _system->getMillis() + 8 * _tickLength;
 			++frame;
@@ -1295,7 +1295,7 @@
 		snd_playSoundEffect(12);
 		for (int i = 0; i < 18; ++i) {
 			timer2 = _system->getMillis() + 4 * _tickLength;
-			_finalC->displayFrame(i, 0, 16, 50);
+			_finalC->displayFrame(i, 0, 16, 50, 0, 0, 0);
 			_screen->updateScreen();
 			delayUntil(timer2);
 		}
@@ -1500,14 +1500,14 @@
 					uint32 nextRun = 0;
 					for (int i = 0; i < 8; ++i) {
 						nextRun = _system->getMillis() + _tickLength;
-						_finalB->displayFrame(i, 0, 224, 8);
+						_finalB->displayFrame(i, 0, 224, 8, 0, 0, 0);
 						_screen->updateScreen();
 						delayUntil(nextRun);
 					}
 					snd_playSoundEffect(0x0D);
 					for (int i = 7; i >= 0; --i) {
 						nextRun = _system->getMillis() + _tickLength;
-						_finalB->displayFrame(i, 0, 224, 8);
+						_finalB->displayFrame(i, 0, 224, 8, 0, 0, 0);
 						_screen->updateScreen();
 						delayUntil(nextRun);
 					}

Modified: scummvm/trunk/engines/kyra/sequences_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sequences_lol.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/sequences_lol.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -155,7 +155,7 @@
 	_screen->clearPage(3);
 
 	if (load) {
-		_chargenWSA = new WSAMovie_v2(this, _screen);
+		_chargenWSA = new WSAMovie_v2(this);
 		assert(_chargenWSA);
 
 		//_charSelection = -1;
@@ -641,7 +641,7 @@
 }
 
 void LoLEngine::showStarcraftLogo() {
-	WSAMovie_v2 *ci = new WSAMovie_v2(this, _screen);
+	WSAMovie_v2 *ci = new WSAMovie_v2(this);
 	assert(ci);
 
 	_screen->clearPage(0);
@@ -653,7 +653,7 @@
 		return;
 	}
 	_screen->hideMouse();
-	ci->displayFrame(0, 2, 32, 80, 0);
+	ci->displayFrame(0, 2, 32, 80, 0, 0, 0);
 	_screen->copyPage(2, 0);
 	_screen->fadeFromBlack();
 	int inputFlag = 0;
@@ -661,7 +661,7 @@
 		inputFlag = checkInput(0) & 0xff;
 		if (shouldQuit() || inputFlag)
 			break;
-		ci->displayFrame(i, 2, 32, 80, 0);
+		ci->displayFrame(i, 2, 32, 80, 0, 0, 0);
 		_screen->copyPage(2, 0);
 		_screen->updateScreen();
 		delay(4 * _tickLength);

Modified: scummvm/trunk/engines/kyra/text_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_mr.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/text_mr.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -581,7 +581,7 @@
 				frame = 13;
 
 			albumRestoreRect();
-			_album.wsa->displayFrame(frame, 2, -100, 90, 0x4000);
+			_album.wsa->displayFrame(frame, 2, -100, 90, 0x4000, 0, 0);
 			albumUpdateRect();
 
 			nextFrame = _system->getMillis() + _rnd.getRandomNumberRng(4, 8) * _tickLength;

Modified: scummvm/trunk/engines/kyra/wsamovie.cpp
===================================================================
--- scummvm/trunk/engines/kyra/wsamovie.cpp	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/wsamovie.cpp	2009-06-09 11:26:15 UTC (rev 41398)
@@ -137,19 +137,19 @@
 	}
 }
 
-void WSAMovie_v1::displayFrame(int frameNum, int pageNum, int x, int y, ...) {
-	if (frameNum >= _numFrames || !_opened)
+void WSAMovie_v1::displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2) {
+	if (frameNum >= _numFrames || frameNum < 0 || !_opened)
 		return;
 
 	_x = x;
 	_y = y;
 	_drawPage = pageNum;
 
-	uint8 *dst;
+	uint8 *dst = 0;
 	if (_flags & WF_OFFSCREEN_DECODE)
 		dst = _offscreenBuffer;
 	else
-		dst = _vm->screen()->getPageRect(_drawPage, _x, _y, _width, _height);
+		dst = _screen->getPageRect(_drawPage, _x, _y, _width, _height);
 
 	if (_currentFrame == _numFrames) {
 		if (!(_flags & WF_NO_FIRST_FRAME)) {
@@ -200,8 +200,16 @@
 
 	// display
 	_currentFrame = frameNum;
-	if (_flags & WF_OFFSCREEN_DECODE)
-		_vm->screen()->copyBlockToPage(_drawPage, _x, _y, _width, _height, _offscreenBuffer);
+	if (_flags & WF_OFFSCREEN_DECODE) {
+		int pageBackUp = _screen->setCurPage(_drawPage);
+
+		int plotFunc = (flags & 0xFF00) >> 12;
+		int unk1 = flags & 0xFF;
+
+		_screen->copyWsaRect(_x, _y, _width, _height, 0, plotFunc, _offscreenBuffer, unk1, table1, table2);
+
+		_screen->_curPage = pageBackUp;
+	}
 }
 
 void WSAMovie_v1::processFrame(int frameNum, uint8 *dst) {
@@ -239,7 +247,7 @@
 	WSAMovie_v1::close();
 }
 
-void WSAMovieAmiga::displayFrame(int frameNum, int pageNum, int x, int y, ...) {
+void WSAMovieAmiga::displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2) {
 	if (frameNum >= _numFrames || frameNum < 0 || !_opened)
 		return;
 
@@ -266,7 +274,7 @@
 
 				dst = _buffer;
 			} else {
-				_vm->screen()->copyBlockToPage(_drawPage, _x, _y, _width, _height, _buffer);
+				_screen->copyBlockToPage(_drawPage, _x, _y, _width, _height, _buffer);
 			}
 		}
 		_currentFrame = 0;
@@ -311,8 +319,16 @@
 
 	// display
 	_currentFrame = frameNum;
-	if (_flags & WF_OFFSCREEN_DECODE)
-		_vm->screen()->copyBlockToPage(_drawPage, _x, _y, _width, _height, _offscreenBuffer);
+	if (_flags & WF_OFFSCREEN_DECODE) {
+		int pageBackUp = _screen->setCurPage(_drawPage);
+
+		int plotFunc = (flags & 0xFF00) >> 12;
+		int unk1 = flags & 0xFF;
+
+		_screen->copyWsaRect(_x, _y, _width, _height, 0, plotFunc, _offscreenBuffer, unk1, table1, table2);
+
+		_screen->_curPage = pageBackUp;
+	}
 }
 
 void WSAMovieAmiga::processFrame(int frameNum, uint8 *dst) {
@@ -334,7 +350,7 @@
 		dst = _offscreenBuffer;
 		dstPitch = _width;
 	} else {
-		dst = _vm->screen()->getPageRect(_drawPage, _x, _y, _width, _height);
+		dst = _screen->getPageRect(_drawPage, _x, _y, _width, _height);
 		dstPitch = Screen::SCREEN_W;
 	}
 
@@ -347,7 +363,7 @@
 
 #pragma mark -
 
-WSAMovie_v2::WSAMovie_v2(KyraEngine_v1 *vm, Screen_v2 *screen) : WSAMovie_v1(vm), _screen(screen), _xAdd(0), _yAdd(0) {}
+WSAMovie_v2::WSAMovie_v2(KyraEngine_v1 *vm) : WSAMovie_v1(vm), _xAdd(0), _yAdd(0) {}
 
 int WSAMovie_v2::open(const char *filename, int unk1, uint8 *palBuf) {
 	close();
@@ -376,7 +392,7 @@
 		offsPal = 0x300;
 		_flags |= WF_HAS_PALETTE;
 		if (palBuf)
-			_vm->screen()->loadPalette(wsaData + 8 + ((_numFrames << 2) & 0xFFFF), palBuf, 0x300);
+			_screen->loadPalette(wsaData + 8 + ((_numFrames << 2) & 0xFFFF), palBuf, 0x300);
 	}
 
 	if (flags & 2) {
@@ -384,7 +400,7 @@
 			offsPal = 0x30;
 			_flags |= WF_HAS_PALETTE;
 			if (palBuf)
-				_vm->screen()->loadPalette(wsaData + 8 + ((_numFrames << 2) & 0xFFFF), palBuf, 0x30);
+				_screen->loadPalette(wsaData + 8 + ((_numFrames << 2) & 0xFFFF), palBuf, 0x30);
 		}
 
 		_flags |= WF_XOR;
@@ -448,90 +464,6 @@
 	return _numFrames;
 }
 
-void WSAMovie_v2::displayFrame(int frameNum, int pageNum, int x, int y, ...) {
-	if (frameNum >= _numFrames || frameNum < 0 || !_opened)
-		return;
-
-	_x = x + _xAdd;
-	_y = y + _yAdd;
-	_drawPage = pageNum;
-
-	uint8 *dst = 0;
-	if (_flags & WF_OFFSCREEN_DECODE)
-		dst = _offscreenBuffer;
-	else
-		dst = _screen->getPageRect(_drawPage, _x, _y, _width, _height);
-
-	if (_currentFrame == _numFrames) {
-		if (!(_flags & WF_NO_FIRST_FRAME)) {
-			if (_flags & WF_OFFSCREEN_DECODE)
-				Screen::decodeFrameDelta(dst, _deltaBuffer);
-			else
-				Screen::decodeFrameDeltaPage(dst, _deltaBuffer, _width, (_flags & WF_XOR) == 0);
-		}
-		_currentFrame = 0;
-	}
-
-	// try to reduce the number of needed frame operations
-	int diffCount = ABS(_currentFrame - frameNum);
-	int frameStep = 1;
-	int frameCount;
-	if (_currentFrame < frameNum) {
-		frameCount = _numFrames - frameNum + _currentFrame;
-		if (diffCount > frameCount && !(_flags & WF_NO_LAST_FRAME))
-			frameStep = -1;
-		else
-			frameCount = diffCount;
-	} else {
-		frameCount = _numFrames - _currentFrame + frameNum;
-		if (frameCount >= diffCount || (_flags & WF_NO_LAST_FRAME)) {
-			frameStep = -1;
-			frameCount = diffCount;
-		}
-	}
-
-	// process
-	if (frameStep > 0) {
-		uint16 cf = _currentFrame;
-		while (frameCount--) {
-			cf += frameStep;
-			processFrame(cf, dst);
-			if (cf == _numFrames)
-				cf = 0;
-		}
-	} else {
-		uint16 cf = _currentFrame;
-		while (frameCount--) {
-			if (cf == 0)
-				cf = _numFrames;
-			processFrame(cf, dst);
-			cf += frameStep;
-		}
-	}
-
-	// display
-	_currentFrame = frameNum;
-	if (_flags & WF_OFFSCREEN_DECODE) {
-		int pageBackUp = _screen->_curPage;
-		_screen->_curPage = _drawPage;
-
-		va_list args;
-		va_start(args, y);
-
-		int copyParam = va_arg(args, int);
-		int plotFunc = (copyParam & 0xFF00) >> 12;
-		int unk1 = copyParam & 0xFF;
-
-		const uint8 *unkPtr1 = va_arg(args, const uint8*);
-		const uint8 *unkPtr2 = va_arg(args, const uint8*);
-		va_end(args);
-
-		_screen->copyWsaRect(_x, _y, _width, _height, 0, plotFunc, _offscreenBuffer, unk1, unkPtr1, unkPtr2);
-
-		_screen->_curPage = pageBackUp;
-	}
-}
-
 } // end of namespace Kyra
 
 

Modified: scummvm/trunk/engines/kyra/wsamovie.h
===================================================================
--- scummvm/trunk/engines/kyra/wsamovie.h	2009-06-09 11:07:18 UTC (rev 41397)
+++ scummvm/trunk/engines/kyra/wsamovie.h	2009-06-09 11:26:15 UTC (rev 41398)
@@ -37,7 +37,7 @@
 
 class Movie {
 public:
-	Movie(KyraEngine_v1 *vm) : _vm(vm), _opened(false),  _x(-1), _y(-1), _drawPage(-1) {}
+	Movie(KyraEngine_v1 *vm) : _vm(vm), _screen(vm->screen()), _opened(false),  _x(-1), _y(-1), _drawPage(-1) {}
 	virtual ~Movie() {}
 
 	virtual bool opened() { return _opened; }
@@ -53,10 +53,11 @@
 
 	virtual int frames() = 0;
 
-	virtual void displayFrame(int frameNum, int pageNum, int x, int y, ...) = 0;
+	virtual void displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2) = 0;
 
 protected:
 	KyraEngine_v1 *_vm;
+	Screen *_screen;
 	bool _opened;
 
 	int _x, _y;
@@ -76,7 +77,7 @@
 
 	virtual int frames() { return _opened ? _numFrames : -1; }
 
-	virtual void displayFrame(int frameNum, int pageNum, int x, int y, ...);
+	virtual void displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2);
 
 	enum WSAFlags {
 		WF_OFFSCREEN_DECODE = 0x10,
@@ -107,7 +108,7 @@
 	int open(const char *filename, int offscreen, uint8 *palette);
 	void close();
 
-	void displayFrame(int frameNum, int pageNum, int x, int y, ...);
+	void displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2);
 private:
 	void processFrame(int frameNum, uint8 *dst);
 
@@ -116,20 +117,19 @@
 
 class WSAMovie_v2 : public WSAMovie_v1 {
 public:
-	WSAMovie_v2(KyraEngine_v1 *vm, Screen_v2 *screen);
+	WSAMovie_v2(KyraEngine_v1 *vm);
 
 	int open(const char *filename, int unk1, uint8 *palette);
+	virtual void displayFrame(int frameNum, int pageNum, int x, int y, uint16 flags, const uint8 *table1, const uint8 *table2) {
+		WSAMovie_v1::displayFrame(frameNum, pageNum, x + _xAdd, y + _yAdd, flags, table1, table2);
+	}
 
-	virtual void displayFrame(int frameNum, int pageNum, int x, int y, ...);
-
 	int xAdd() const { return _xAdd; }
 	int yAdd() const { return _yAdd; }
 
 	void setWidth(int w) { _width = w; }
 	void setHeight(int h) { _height = h; }
 protected:
-	Screen_v2 *_screen;
-
 	int16 _xAdd;
 	int16 _yAdd;
 };


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list