[Scummvm-cvs-logs] SF.net SVN: scummvm:[36320] scummvm/trunk

athrxx at users.sourceforge.net athrxx at users.sourceforge.net
Sat Feb 14 01:51:07 CET 2009


Revision: 36320
          http://scummvm.svn.sourceforge.net/scummvm/?rev=36320&view=rev
Author:   athrxx
Date:     2009-02-14 00:51:07 +0000 (Sat, 14 Feb 2009)

Log Message:
-----------
LOL:
- implemented some input code
- you can walk around now (not very far though, since doors don't work yet). Keyboard control is still missing
- processButtonList isn't really implemented yet for LOL. I'll still have to check which features are  needed here.

Modified Paths:
--------------
    scummvm/trunk/dists/engine-data/kyra.dat
    scummvm/trunk/engines/kyra/gui_lol.cpp
    scummvm/trunk/engines/kyra/kyra_v1.cpp
    scummvm/trunk/engines/kyra/lol.cpp
    scummvm/trunk/engines/kyra/lol.h
    scummvm/trunk/engines/kyra/resource.h
    scummvm/trunk/engines/kyra/scene_lol.cpp
    scummvm/trunk/engines/kyra/screen_lol.cpp
    scummvm/trunk/engines/kyra/screen_lol.h
    scummvm/trunk/engines/kyra/script_lol.cpp
    scummvm/trunk/engines/kyra/staticres.cpp
    scummvm/trunk/engines/kyra/text_lol.cpp
    scummvm/trunk/engines/kyra/text_lol.h
    scummvm/trunk/tools/create_kyradat/create_kyradat.cpp
    scummvm/trunk/tools/create_kyradat/create_kyradat.h
    scummvm/trunk/tools/create_kyradat/lol_cd.h
    scummvm/trunk/tools/create_kyradat/misc.h

Modified: scummvm/trunk/dists/engine-data/kyra.dat
===================================================================
(Binary files differ)

Modified: scummvm/trunk/engines/kyra/gui_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/gui_lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -124,6 +124,10 @@
 	}
 }
 
+void LoLEngine::gui_highlightSelectedSpell(int unk) {
+
+}
+
 void LoLEngine::gui_drawAllCharPortraitsWithStats() {
 	int numChars = countActiveCharacters();
 	if (!numChars)
@@ -364,7 +368,7 @@
 
 	if (!_hideControls) {
 		for (int i = 76; i < 85; i++)
-			gui_disableArrowButton(i, 2);
+			gui_toggleButtonDisplayMode(i, 2);
 	}
 
 	gui_toggleFightButtons(false);
@@ -380,14 +384,14 @@
 	gui_toggleFightButtons(true);
 
 	for (int i = 76; i < 85; i++)
-		gui_disableArrowButton(i, ((controlMode & 2) && (i > 78)) ? 2 : 3);
+		gui_toggleButtonDisplayMode(i, ((controlMode & 2) && (i > 78)) ? 2 : 3);
 
 	return 1;
 }
 
-void LoLEngine::gui_disableArrowButton(int shapeIndex, int mode) {
-	static const int16 arrowButtonX[] = { 0x000C, 0x0021, 0x0122, 0x000C, 0x0021, 0x0036, 0x000C, 0x0021, 0x0036 };
-	static const int16 arrowButtonY[] = { 0x00B4, 0x00B4, 0x0020, 0x0084, 0x0084, 0x0084, 0x0096, 0x0096, 0x0096 };
+void LoLEngine::gui_toggleButtonDisplayMode(int shapeIndex, int mode) {
+	static const int16 buttonX[] = { 0x0056, 0x0128, 0x000C, 0x0021, 0x0122, 0x000C, 0x0021, 0x0036, 0x000C, 0x0021, 0x0036 };
+	static const int16 buttonY[] = { 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x0020, 0x0084, 0x0084, 0x0084, 0x0096, 0x0096, 0x0096 };
 
 	if (shapeIndex == 78 && !(_screen->_drawGuiFlag & 0x1000))
 		return;
@@ -396,12 +400,12 @@
 		return;
 
 	if (mode == 0)
-		shapeIndex = _lastArrowButtonShape;
+		shapeIndex = _lastButtonShape;
 
 	int pageNum = 0;
 
-	int16 x1 = arrowButtonX[shapeIndex - 76];
-	int16 y1 = arrowButtonY[shapeIndex - 76];
+	int16 x1 = buttonX[shapeIndex - 74];
+	int16 y1 = buttonY[shapeIndex - 74];
 	int16 x2 = 0;
 	int16 y2 = 0;
 	uint32 t = 0;
@@ -409,25 +413,25 @@
 	switch (mode) {
 		case 1:
 			mode = 0x100;
-			_lastArrowButtonShape = shapeIndex;
+			_lastButtonShape = shapeIndex;
 			break;
 
 		case 0:
-			if (!_lastArrowButtonShape)
+			if (!_lastButtonShape)
 				return;
 
 			t = _system->getMillis();
-			if (_arrowButtonTimer > t)
-				delay(_arrowButtonTimer - t);
+			if (_buttonPressTimer > t)
+				delay(_buttonPressTimer - t);
 
 		case 2:
 			mode = 0;
-			_lastArrowButtonShape = 0;
+			_lastButtonShape = 0;
 			break;
 
 		case 3:
 			mode = 0;
-			_lastArrowButtonShape = 0;
+			_lastButtonShape = 0;
 			pageNum = 6;
 
 			x2 = x1;
@@ -442,17 +446,20 @@
 
 	_screen->drawShape(pageNum, _gameShapes[shapeIndex], x1, y1, 0, mode, _screen->_paletteOverlay1, 1);
 	
-	if (pageNum != 6)
-		return;
+	if (!pageNum)
+		_screen->updateScreen();
+		
+	if (pageNum == 6) {
+		int cp = _screen->setCurPage(6);
 
-	int cp = _screen->setCurPage(6);
+		_screen->drawGridBox(x1, y1, _gameShapes[shapeIndex][3], _gameShapes[shapeIndex][2], 1);
+		_screen->copyRegion(x1, y1, x2, y2, _gameShapes[shapeIndex][3], _gameShapes[shapeIndex][2], pageNum, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
 
-	_screen->drawGridBox(x1, y1, _gameShapes[shapeIndex][3], _gameShapes[shapeIndex][2], 1);
-	_screen->copyRegion(x1, y1, x2, y2, _gameShapes[shapeIndex][3], _gameShapes[shapeIndex][2], pageNum, 0, Screen::CR_NO_P_CHECK);
+		_screen->setCurPage(cp);
+	}
 
-	_screen->setCurPage(cp);
-
-	_arrowButtonTimer = _system->getMillis() + 6 * _tickLength;
+	_buttonPressTimer = _system->getMillis() + 6 * _tickLength;
 }
 
 void LoLEngine::gui_toggleFightButtons(bool disable) {
@@ -481,27 +488,222 @@
 	}	
 }
 
+void LoLEngine::gui_updateInput() {
+	int inputFlag = checkInput(_activeButtons, true);
+	removeInputTop();
+
+	if (inputFlag && _unkCharNum != -1 && !(inputFlag & 0x8800)) {
+		gui_enableDefaultPlayfieldButtons();
+		_characters[_unkCharNum].flags &= 0xffef;
+		gui_drawCharPortraitWithStats(_unkCharNum);
+		//processMouseButtonEvent(inputFlag);
+		_unkCharNum = -1;
+		inputFlag = 0;
+	}
+
+	if (inputFlag == 1) {
+		if (_weaponsDisabled || _availableSpells[1] == -1)
+			return;
+
+		gui_highlightSelectedSpell(0);
+		if (_availableSpells[++_selectedSpell] == -1)
+			_selectedSpell = 0;
+		gui_highlightSelectedSpell(1);
+
+		gui_drawAllCharPortraitsWithStats();
+	} else if (inputFlag == 3) {
+		// TODO
+		//processPortraitGuiText
+	} else {
+		snd_dialogueSpeechUpdate(1);
+	}
+}
+
+void LoLEngine::gui_enableDefaultPlayfieldButtons() {
+	gui_resetButtonList();
+	gui_initButtonsFromList(_buttonList1);
+	gui_initCharacterControlButtons(7, 44);
+	gui_initCharacterControlButtons(11, 44);
+	gui_initCharacterControlButtons(17, 0);
+	gui_initCharacterControlButtons(29, 0);
+	gui_initCharacterControlButtons(25, 33);
+
+	if (_screen->_drawGuiFlag & 0x2000)
+		gui_initMagicScrollButtons();
+}
+
+void LoLEngine::gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags) {
+	gui_resetButtonList();
+
+	_sceneWindowButton.x = x;
+	_sceneWindowButton.y = y;
+	_sceneWindowButton.w = w;
+	_sceneWindowButton.h = h;
+
+	gui_initButtonsFromList(_buttonList3);
+	
+	if (enableFlags & 1)
+		gui_initButtonsFromList(_buttonList4);
+
+	if (enableFlags & 2)
+		gui_initButtonsFromList(_buttonList5);
+}
+	
+void LoLEngine::gui_resetButtonList() {
+	while (_activeButtons) {
+		Button *n = _activeButtons->nextButton;
+		delete _activeButtons;
+		_activeButtons = n;
+	}
+
+	_activeButtons = 0;
+}
+
+void LoLEngine::gui_initButtonsFromList(const int16 *list) {
+	while (*list != -1)
+		gui_initButton(*list++);
+}
+
+void LoLEngine::gui_initCharacterControlButtons(int index, int xOffs) {
+	int c = countActiveCharacters();
+	for (int i = 0; i < c; i++)
+		gui_initButton(index + i, _activeCharsXpos[i] + xOffs);
+}
+
+void LoLEngine::gui_initMagicScrollButtons() {
+
+}
+
+void LoLEngine::gui_initButton(int index, int x) {
+	Button *b = new Button;
+	memset (b, 0, sizeof(Button));
+
+	int cnt = 1;
+
+	if (_activeButtons) {
+		cnt++;
+		Button *n = _activeButtons;
+
+		while (n->nextButton) {
+			n = n->nextButton;
+			cnt++;
+		}
+
+		n->nextButton = b;
+
+	} else {
+		_activeButtons = b;
+	}
+
+	b->data0Val2 = 0xfe;
+	b->data0Val3 = 0x01;
+	b->data1Val2 = 0xfe;
+	b->data1Val3 = 0x01;
+	b->data2Val2 = 0xfe;
+	b->data2Val3 = 0x01;
+
+	b->index = cnt;
+	b->unk6 = _buttonData[index].clickedShapeId;
+	b->unk8 = _buttonData[index].unk2;
+	b->dimTableIndex = _buttonData[index].screenDim;
+	b->flags = _buttonData[index].buttonflags;
+	
+	b->data2Val2 = _buttonData[index].index;
+
+	if (index == 64) {
+		// scene window button
+		b->x = _sceneWindowButton.x;
+		b->y = _sceneWindowButton.y;
+		b->width = _sceneWindowButton.w - 1;
+		b->height = _sceneWindowButton.h - 1;
+	} else {
+		b->x = x != -1 ? x : _buttonData[index].x;
+		b->y = _buttonData[index].y;
+		b->width = _buttonData[index].w - 1;
+		b->height = _buttonData[index].h - 1;
+	}
+
+	assignButtonCallback(b, index);
+}
+
 int LoLEngine::clickedUpArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	moveParty(_currentDirection, ((button->flags2 & 0x1080) == 0x1080) ? 1 : 0, 0, 80);
+
 	return 1;
 }
 
 int LoLEngine::clickedDownArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	moveParty(_currentDirection ^ 2, 0, 1, 83);
+
 	return 1;
 }
 
 int LoLEngine::clickedLeftArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	moveParty((_currentDirection - 1) & 3, ((button->flags2 & 0x1080) == 0x1080) ? 1 : 0, 2, 82);
+
 	return 1;
 }
 
 int LoLEngine::clickedRightArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	moveParty((_currentDirection + 1) & 3, ((button->flags2 & 0x1080) == 0x1080) ? 1 : 0, 3, 84);
+
 	return 1;
 }
 
 int LoLEngine::clickedTurnLeftArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	gui_toggleButtonDisplayMode(79, 1);
+	_currentDirection = (--_currentDirection) & 3;
+
+	_sceneDefaultUpdate = 1;
+
+	runSceneScript(_currentBlock, 0x4000);
+	updatePortraitUnkTimeSub(2, 0);
+
+	if (!_sceneDefaultUpdate)
+		gui_drawScene(0);
+	else
+		movePartySmoothScrollTurnLeft(1);		
+
+	gui_toggleButtonDisplayMode(79, 0);
+	runSceneScript(_currentBlock, 0x10);
 	return 1;
 }
 
 int LoLEngine::clickedTurnRightArrow(Button *button) {
+	if (button->data2Val2 && !(_unkGameFlag & 4))
+		return 0;
+
+	gui_toggleButtonDisplayMode(81, 1);
+	_currentDirection = (++_currentDirection) & 3;
+
+	_sceneDefaultUpdate = 1;
+
+	runSceneScript(_currentBlock, 0x4000);
+	updatePortraitUnkTimeSub(2, 0);
+
+	if (!_sceneDefaultUpdate)
+		gui_drawScene(0);
+	else
+		movePartySmoothScrollTurnRight(1);		
+
+	gui_toggleButtonDisplayMode(81, 0);
+	runSceneScript(_currentBlock, 0x10);
+
 	return 1;
 }
 
@@ -554,6 +756,12 @@
 }
 
 int LoLEngine::clickedInventoryScroll(Button *button) {
+	int8 dir = (int8) button->data2Val2;
+	int shp = (dir == 1) ? 75 : 74;
+
+	gui_toggleButtonDisplayMode(shp, 1);
+
+	gui_toggleButtonDisplayMode(shp, 0);
 	return 1;
 }
 
@@ -561,7 +769,7 @@
 	return 1;
 }
 
-int LoLEngine::clickedUnk21(Button *button) {
+int LoLEngine::clickedScene(Button *button) {
 	return 1;
 }
 
@@ -582,26 +790,34 @@
 }
 
 int LoLEngine::clickedOptions(Button *button) {
+	gui_toggleButtonDisplayMode(76, 1);
+
+	gui_toggleButtonDisplayMode(76, 0);
+
 	return 1;
 }
 
 int LoLEngine::clickedRestParty(Button *button) {
+	gui_toggleButtonDisplayMode(77, 1);
+
+	gui_toggleButtonDisplayMode(77, 0);
+
 	return 1;
 }
 
-int LoLEngine::clickedUnk28(Button *button) {
+int LoLEngine::clickedMoneyBox(Button *button) {
 	return 1;
 }
 
-int LoLEngine::clickedUnk29(Button *button) {
+int LoLEngine::clickedCompass(Button *button) {
 	return 1;
 }
 
-int LoLEngine::clickedUnk30(Button *button) {
+int LoLEngine::clickedAutomap(Button *button) {
 	return 1;
 }
 
-int LoLEngine::clickedUnk31(Button *button) {
+int LoLEngine::clickedLamp(Button *button) {
 	return 1;
 }
 
@@ -615,13 +831,13 @@
 }
 
 int GUI_LoL::processButtonList(Button *list, uint16 inputFlag, int8 mouseWheel) {
-	if ((inputFlag & 0xFF) == 199)
-		_pressFlag = true;
-	else if ((inputFlag & 0xFF) == 200)
-		_pressFlag = false;
+	inputFlag &= 0x7fff;
 
 	int returnValue = 0;
 	while (list) {
+		bool processMouseClick = (inputFlag == 199 && list->flags & 0x100) || (inputFlag == 299 && list->flags & 0x1000);
+		bool target = _vm->posWithinRect(_vm->_mouseX, _vm->_mouseY, list->x, list->y, list->x + list->width, list->y + list->height);
+
 		/*if (list->flags & 8) {
 			list = list->nextButton;
 			continue;
@@ -682,9 +898,15 @@
 				processButton(list);
 				_screen->updateScreen();
 			}
+		}*/
+		if (processMouseClick && target) {
+			if (list->buttonCallback) {
+				if ((*list->buttonCallback.get())(list))
+					break;
+			}
 		}
 
-		list = list->nextButton;*/
+		list = list->nextButton;
 	}
 
 	if (!returnValue)

Modified: scummvm/trunk/engines/kyra/kyra_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v1.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/kyra_v1.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -341,8 +341,11 @@
 	while (_eventMan->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE)
-				_eventList.push_back(Event(event, true));
+			if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE ||
+				event.kbd.keycode == Common::KEYCODE_SPACE || event.kbd.keycode == Common::KEYCODE_RETURN ||
+				event.kbd.keycode == Common::KEYCODE_UP || event.kbd.keycode == Common::KEYCODE_RIGHT ||
+				event.kbd.keycode == Common::KEYCODE_DOWN || event.kbd.keycode == Common::KEYCODE_LEFT)
+					_eventList.push_back(Event(event, true));
 			else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
 				quitGame();
 			else
@@ -350,6 +353,7 @@
 			break;
 
 		case Common::EVENT_LBUTTONDOWN:
+		case Common::EVENT_RBUTTONDOWN:
 			_eventList.push_back(Event(event, true));
 			break;
 
@@ -358,6 +362,7 @@
 			// fall through
 
 		case Common::EVENT_LBUTTONUP:
+		case Common::EVENT_RBUTTONUP:
 		case Common::EVENT_WHEELUP:
 		case Common::EVENT_WHEELDOWN:
 			_eventList.push_back(event);

Modified: scummvm/trunk/engines/kyra/lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -40,7 +40,7 @@
 LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(system, flags) {
 	_screen = 0;
 	_gui = 0;
-	_dlg = 0;
+	_txt = 0;
 	_tim = 0;
 
 	switch (_flags.lang) {
@@ -91,26 +91,31 @@
 	_gameShapeMap = 0;
 	memset(_monsterUnk, 0, 3);
 
+	_ingameMT32SoundIndex = _ingameGMSoundIndex = /*_ingameADLSoundIndex =*/ 0;
+
 	_charSelection = -1;
 	_characters = 0;
 	_spellProperties = 0;
 	_updateFlags = 0;
 	_selectedSpell = 0;
-	_updateCharNum = _updateCharV1 = _updateCharV2 = _updateCharV3 = _updateCharV4 = _restorePalette = _hideInventory = 0;
+	_updateCharNum = _updateCharV1 = _updateCharV2 = _updateCharV3 = _textColourFlag = _hideInventory = 0;
+	_fadeText = false;
 	_palUpdateTimer = _updatePortraitNext = 0;
 	_lampStatusTimer = 0xffffffff;
 
 	_weaponsDisabled = false;
-	_lastArrowButtonShape = 0;
-	_arrowButtonTimer = 0;
+	_lastButtonShape = 0;
+	_buttonPressTimer = 0;
 	_selectedCharacter = 0;
 	_unkFlag = 0;
 	_scriptBoolSkipExec = _sceneUpdateRequired = false;
-	_unkScriptByte = 0;
+	_scriptDirection = 0;
 	_currentDirection = 0;
 	_currentBlock = 0;
-	memset(_scriptExecutedFuncs, 0, 18 * sizeof(uint16));
+	memset(_currentBlockPropertyIndex, 0, 18 * sizeof(uint16));
 
+	_scrollSceneBuffer = 0;
+	_smoothScrollModeNormal = 1;
 	_wllVmpMap = _wllBuffer3 = _wllBuffer4 = _wllWallFlags = 0;
 	_wllShapeMap = 0;
 	_lvlShapeTop = _lvlShapeBottom = _lvlShapeLeftRight = 0;
@@ -127,6 +132,7 @@
 	_trueLightTable1 = 0;
 	_levelShapeProperties = 0;
 	_levelShapes = 0;
+	_scriptAssignedLevelShape = 0;
 	_blockDrawingBuffer = 0;
 	_sceneWindowBuffer = 0;
 	memset (_doorShapes, 0, 2 * sizeof(uint8*));
@@ -137,7 +143,7 @@
 	_cLevelItems = 0;
 	_unkGameFlag = 0;
 	_lastMouseRegion = 0;
-	_preSeq_X1 = _preSeq_Y1 = _preSeq_X2 = _preSeq_Y2 = 0;
+	//_preSeq_X1 = _preSeq_Y1 = _preSeq_X2 = _preSeq_Y2 = 0;
 
 	_dscUnk1 = 0;
 	_dscShapeIndex = 0;
@@ -175,7 +181,9 @@
 	memset(_activeTim, 0, 10 * sizeof(TIM*));
 	memset(_activeVoiceFile, 0, sizeof(_activeVoiceFile));
 		
-	//_dlgAnimCallback = &TextDisplayer_LoL::portraitAnimation1;
+	_buttonData = 0;
+	_activeButtons = 0;
+	_buttonList1 = _buttonList2 = _buttonList3 = _buttonList4 = _buttonList5 = _buttonList6 = _buttonList7 = _buttonList8 = 0;
 }
 
 LoLEngine::~LoLEngine() {
@@ -187,7 +195,7 @@
 	delete _screen;
 	delete _gui;
 	delete _tim;
-	delete _dlg;
+	delete _txt;
 
 	delete[]  _itemsInPlay;
 	delete[]  _itemProperties;
@@ -263,6 +271,8 @@
 	delete[] _cLevelItems;
 	delete[] _levelBlockProperties;
 	delete[] _monsterProperties;
+	delete[] _scrollSceneBuffer;
+	delete[] _scriptAssignedLevelShape;
 
 	delete[] _levelFileData;
 	delete[] _vcnExpTable;
@@ -291,6 +301,8 @@
 			delete[] _ingameSoundList[i];
 		delete[] _ingameSoundList;	
 	}
+
+	gui_resetButtonList();
 }
 
 Screen *LoLEngine::screen() {
@@ -312,12 +324,11 @@
 	_gui = new GUI_LoL(this);
 	assert(_gui);
 	_gui->initStaticData();
-	initButtonList();
 
 	_tim = new TIMInterpreter_LoL(this, _screen, _system);
 	assert(_tim);
 
-	_dlg = new TextDisplayer_LoL(this, _screen);
+	_txt = new TextDisplayer_LoL(this, _screen);
 
 	_screen->setAnimBlockPtr(10000);
 	_screen->setScreenDim(0);
@@ -365,6 +376,8 @@
 	_monsterProperties = new MonsterProperty[5];
 	memset(_monsterProperties, 0, 5 * sizeof(MonsterProperty));
 
+	_scrollSceneBuffer = new uint8[21120];
+
 	_vcnExpTable = new uint8[128];
 	for (int i = 0; i < 128; i++)
 		_vcnExpTable[i] = i & 0x0f;
@@ -394,6 +407,7 @@
 	memset(&_scriptData, 0, sizeof(EMCData));
 	
 	_levelFlagUnk = 0;
+	_unkCharNum = -1;
 
 	return Common::kNoError;
 }
@@ -614,8 +628,8 @@
 	memset(_screen->_currentPalette, 0x3f, 0x180);
 	memcpy(_screen->_currentPalette + 3, tmpPal + 3, 3);
 	memset(_screen->_currentPalette + 0x240, 0x3f, 12);
-	_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay1, 1, 6);
-	_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay2, 0x90, 0x41);
+	_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay1, 1, 96);
+	_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay2, 144, 65);
 	memcpy(_screen->_currentPalette, tmpPal, 0x300);
 	delete[] tmpPal;
 
@@ -672,11 +686,13 @@
 	
 	_loadSuppFilesFlag = 1;
 
-	_dlg->setAnimParameters("<MORE>", 10, 31, 0);
-	_dlg->setAnimFlag(true);
+	_txt->setAnimParameters("<MORE>", 10, 31, 0);
+	_txt->setAnimFlag(true);
 
 	_screen->_dimLineCount = 0;
 
+	_sound->loadSfxFile("LORESFX");
+
 	setMouseCursorToItemInHand();
 }
 
@@ -708,7 +724,7 @@
 	static int selectIds[] = { -9, -1, -8, -5 };
 	addCharacter(selectIds[_charSelection]);
 
-	// TODO 
+	gui_enableDefaultPlayfieldButtons();
 
 	loadLevel(1);
 
@@ -743,14 +759,13 @@
 
 	while (!shouldQuit() && _runFlag) {
 		if (_nextScriptFunc) {
-			runResidentScript(_nextScriptFunc, 2);
+			runSceneScript(_nextScriptFunc, 2);
 			_nextScriptFunc = 0;
 		}
 
 		//processUnkAnimStructs();
 		//checkFloatingPointerRegions();
-		//processCharacters();
-		checkInput(0, true);
+		gui_updateInput();
 		
 		update();
 
@@ -781,7 +796,7 @@
 		updateCompass();
 
 	snd_characterSpeaking();
-	restorePaletteEntry();
+	fadeText();
 
 	_screen->updateScreen();
 }
@@ -974,8 +989,8 @@
 }
 
 void LoLEngine::updatePortraitUnkTimeSub(int unk1, int unk2) {
-	if (_updateCharV4 == unk1 || !unk1) {
-		_restorePalette = 1;
+	if (_textColourFlag == unk1 || !unk1) {
+		_fadeText = true;
 		_palUpdateTimer = _system->getMillis();
 	}
 
@@ -989,7 +1004,7 @@
 		_screen->showMouse();
 	}
 	
-	_restorePalette = 0;
+	_fadeText = false;
 	//initGuiUnk(11);
 }
 
@@ -1045,8 +1060,8 @@
 
 	_updateFlags |= 3;
 
-	_dlg->setupField(true);
-	_dlg->expandField();
+	_txt->setupField(true);
+	_txt->expandField();
 	setupScreenDims();
 	gui_disableControls(controlMode);
 }
@@ -1073,13 +1088,13 @@
 	removeUnkFlags(2);
 }
 
-void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int unk) {
-	//resetGuiUnk(x, y, w, h, unk);
+void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags) {
+	setSequenceGui(x, y, w, h, buttonFlags);
 
-	_preSeq_X1 = x;
+	/*_preSeq_X1 = x;
 	_preSeq_Y1 = y;
 	_preSeq_X2 = x + w;
-	_preSeq_Y2 = y + h;
+	_preSeq_Y2 = y + h;*/
 
 	int mouseOffs = _itemInHand ? 10 : 0;
 	_screen->setMouseCursor(mouseOffs, mouseOffs, getItemIconShapePtr(_itemInHand));
@@ -1094,10 +1109,10 @@
 
 void LoLEngine::restoreSceneAfterDialogueSequence(int redraw) {
 	gui_enableControls();
-	_dlg->setupField(false);
+	_txt->setupField(false);
 	_updateFlags &= 0xffdf;
 
-	//loadLevel_initGui()
+	restoreDefaultGui();
 
 	for (int i = 0; i < 6; i++)
 		_tim->freeAnimStruct(i);
@@ -1115,11 +1130,12 @@
 	_hideInventory = 0;
 }
 
-void LoLEngine::restorePaletteEntry() {
-	if (!_restorePalette)
+void LoLEngine::fadeText() {
+	if (!_fadeText)
 		return;
 
-	_screen->copyColour(192, 252, _system->getMillis() - _palUpdateTimer, 60 * _tickLength);
+	if (_screen->fadeColour(192, 252, _system->getMillis() - _palUpdateTimer, 60 * _tickLength))
+		return;
 
 	if (_hideInventory)
 		return;
@@ -1128,7 +1144,7 @@
 
 	///initGuiUnk(11);
 
-	_restorePalette = 0;
+	_fadeText = false;
 }
 
 void LoLEngine::updateWsaAnimations() {
@@ -1274,6 +1290,11 @@
 			track = track < _ingameMT32SoundIndexSize ? _ingameMT32SoundIndex[track] - 1 : -1;
 		else if (_sound->getSfxType() == Sound::kMidiGM)
 			track = track < _ingameGMSoundIndexSize ? _ingameGMSoundIndex[track] - 1: -1;
+		//else if (_sound->getSfxType() == Sound::kAdlib)
+		//	track = track < _ingameADLSoundIndexSize ? _ingameADLSoundIndex[track] - 1: -1;
+		
+		if (track == 168)
+			track = 167;
 
 		if (track != -1)
 			KyraEngine_v1::snd_playSoundEffect(track);

Modified: scummvm/trunk/engines/kyra/lol.h
===================================================================
--- scummvm/trunk/engines/kyra/lol.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/lol.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -210,14 +210,13 @@
 struct ButtonDef {
 	uint16 buttonflags;
 	uint8 clickedShapeId;
-	uint8 unk1;
 	uint16 unk2;
 	int16 x;
 	int16 y;
 	uint16 w;
 	uint16 h;
 	uint16 index;
-	uint16 flag;
+	uint16 screenDim;
 };
 
 class LoLEngine : public KyraEngine_v1 {
@@ -351,6 +350,8 @@
 	int _ingameGMSoundIndexSize;
 	const uint8 *_ingameMT32SoundIndex;
 	int _ingameMT32SoundIndexSize;
+	/*const uint8 *_ingameADLSoundIndex;
+	int _ingameADLSoundIndexSize;*/
 
 	// gui
 	void gui_drawPlayField();
@@ -365,16 +366,17 @@
 	void gui_drawInventoryItem(int index);
 	void gui_drawCompass();
 	void gui_drawScroll();
+	void gui_highlightSelectedSpell(int unk);
 
 	int gui_enableControls();
 	int gui_disableControls(int controlMode);
-	void gui_disableArrowButton(int shapeIndex, int mode);
+	void gui_toggleButtonDisplayMode(int shapeIndex, int mode);
 	void gui_toggleFightButtons(bool disable);
-	void gui_prepareForSequence(int x, int y, int w, int h, int unk);
+	void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags);
 
 	bool _weaponsDisabled;
-	int _lastArrowButtonShape;
-	uint32 _arrowButtonTimer;
+	int _lastButtonShape;
+	uint32 _buttonPressTimer;
 	int _selectedCharacter;
 	int _compassDirection;
 	int _compassUnk;
@@ -383,10 +385,20 @@
 	const CompassDef *_compassDefs;
 	int _compassDefsSize;
 
-	void initButtonList();
-	ButtonDef *_buttonData;
-	Button *_buttonList;
+	void gui_updateInput();
+	void gui_enableDefaultPlayfieldButtons();
+	void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags);
 
+	void gui_resetButtonList();
+	void gui_initButtonsFromList(const int16 *list);
+	void gui_initCharacterControlButtons(int index, int xOffs);
+	void gui_initMagicScrollButtons();
+	void gui_initButton(int index, int x = -1);
+	void assignButtonCallback(Button *button, int index);
+
+	Button *_activeButtons;
+	ButtonDef _sceneWindowButton;
+
 	int clickedUpArrow(Button *button);
 	int clickedDownArrow(Button *button);
 	int clickedLeftArrow(Button *button);
@@ -407,36 +419,55 @@
 	int clickedInventorySlot(Button *button);
 	int clickedInventoryScroll(Button *button);
 	int clickedUnk20(Button *button);
-	int clickedUnk21(Button *button);
+	int clickedScene(Button *button);
 	int clickedScroll(Button *button);
 	int clickedUnk23(Button *button);
 	int clickedUnk24(Button *button);
 	int clickedUnk25(Button *button);
 	int clickedOptions(Button *button);
 	int clickedRestParty(Button *button);
-	int clickedUnk28(Button *button);
-	int clickedUnk29(Button *button);
-	int clickedUnk30(Button *button);
-	int clickedUnk31(Button *button);
+	int clickedMoneyBox(Button *button);
+	int clickedCompass(Button *button);
+	int clickedAutomap(Button *button);
+	int clickedLamp(Button *button);
 	int clickedUnk32(Button *button);
 
+	const ButtonDef *_buttonData;
+	int _buttonDataSize;
+	const int16 *_buttonList1;
+	int _buttonList1Size;
+	const int16 *_buttonList2;
+	int _buttonList2Size;
+	const int16 *_buttonList3;
+	int _buttonList3Size;
+	const int16 *_buttonList4;
+	int _buttonList4Size;
+	const int16 *_buttonList5;
+	int _buttonList5Size;
+	const int16 *_buttonList6;
+	int _buttonList6Size;
+	const int16 *_buttonList7;
+	int _buttonList7Size;
+	const int16 *_buttonList8;
+	int _buttonList8Size;
+
 	// text
-	TextDisplayer_LoL *_dlg;
+	TextDisplayer_LoL *_txt;
 
 	// emc scripts
 	void runInitScript(const char *filename, int func);
 	void runInfScript(const char *filename);
-	void runResidentScript(int func, int reg0);
-	void runResidentScriptCustom(int func, int reg0, int reg1, int reg2, int reg3, int reg4);
+	void runSceneScript(int block, int sub);
+	void runSceneScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4);
 	bool checkScriptUnk(int func);
 	
 	EMCData _scriptData;
 	bool _scriptBoolSkipExec;
-	uint8 _unkScriptByte;
+	uint16 _scriptDirection;
 	uint16 _currentDirection;
 	uint16 _currentBlock;
 	bool _sceneUpdateRequired;
-	int16 _scriptExecutedFuncs[18];
+	int16 _currentBlockPropertyIndex[18];
 	uint16 _gameFlags[15];
 	uint16 _unkEMC46[16];
 
@@ -512,7 +543,7 @@
 	void unkHideInventory();
 	void restoreSceneAfterDialogueSequence(int redraw);
 	void toggleSelectedCharacterFrame(bool mode);
-	void restorePaletteEntry();
+	void fadeText();
 	void updateWsaAnimations();
 
 	uint8 **_itemIconShapes;
@@ -555,14 +586,15 @@
 	int _updateCharV1;
 	int _updateCharV2;
 	int _updateCharV3;
-	int _updateCharV4;
-	int _restorePalette;
+	int _textColourFlag;
+	bool _fadeText;
 	int _hideInventory;
 	uint32 _palUpdateTimer;
 	uint32 _updatePortraitNext;
 
 	int _loadLevelFlag;
 	int _levelFlagUnk;
+	int _unkCharNum;
 
 	uint8 **_monsterShapes;
 	uint8 **_monsterPalettes;
@@ -611,10 +643,11 @@
 	void resetItems(int flag);
 	void resetLvlBuffer();
 	void resetBlockProperties();
+	bool testWallFlag(int block, int direction, int flag);
 	bool testWallInvisibility(int block, int direction);
 
 	void drawScene(int pageNum);
-
+	
 	void generateBlockDrawingBuffer(int block, int direction);
 	void generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries);
 	void generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries);
@@ -634,17 +667,44 @@
 	void drawScriptShapes(int pageNum);
 	void updateSceneWindow();
 
+	void setSequenceGui(int x, int y, int w, int h, int enableFlags);
+	void restoreDefaultGui();
+
 	void updateCompass();
 
-	void moveParty(uint16 direction, int unk1, int unk2, int unk3);
+	void moveParty(uint16 direction, int unk1, int unk2, int buttonShape);
 	uint16 calcNewBlockPostion(uint16 curBlock, uint16 direction);
+	bool checkBlockPassability(uint16 block, uint16 direction);
+	void notifyBlockNotPassable(int scrollFlag);	
 
+	void movePartySmoothScrollBlocked(int speed);
+	void movePartySmoothScrollUp(int speed);
+	void movePartySmoothScrollDown(int speed);
+	void movePartySmoothScrollLeft(int speed);
+	void movePartySmoothScrollRight(int speed);
+	void movePartySmoothScrollTurnLeft(int speed);
+	void movePartySmoothScrollTurnRight(int speed);
+		
+	int smoothScrollDrawSpecialShape(int pageNum);
 	void setLF2(int block);
+
+	uint8 *_scrollSceneBuffer;
+	uint32 _smoothScrollTimer;
+	int _smoothScrollModeNormal;
+
+	const uint8 *_scrollXTop;
+	int _scrollXTopSize;
+	const uint8 *_scrollYTop;
+	int _scrollYTopSize;
+	const uint8 *_scrollXBottom;
+	int _scrollXBottomSize;
+	const uint8 *_scrollYBottom;
+	int _scrollYBottomSize;
 	
 	int _unkFlag;
 	int _nextScriptFunc;
 	uint8 _currentLevel;
-	bool _loadLevelFlag2;
+	int _sceneDefaultUpdate;
 	int _lvlBlockIndex;
 	int _lvlShapeIndex;
 	bool _unkDrawLevelBool;
@@ -656,6 +716,7 @@
 	uint8 *_sceneWindowBuffer;
 	LevelShapeProperty *_levelShapeProperties;
 	uint8 **_levelShapes;
+	uint8 *_scriptAssignedLevelShape;
 
 	char _lastSuppFile[12];
 	char _lastOverridePalFile[12];
@@ -703,7 +764,7 @@
 	int16 _dmScaleH;
 
 	int _lastMouseRegion;
-	int _preSeq_X1, _preSeq_Y1,	_preSeq_X2, _preSeq_Y2;
+	//int _preSeq_X1, _preSeq_Y1,	_preSeq_X2, _preSeq_Y2;
 	uint8 _unkGameFlag;
 
 	uint8 *_tempBuffer5120;

Modified: scummvm/trunk/engines/kyra/resource.h
===================================================================
--- scummvm/trunk/engines/kyra/resource.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/resource.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -217,6 +217,7 @@
 	lolMusicTrackMap,
 	lolIngameGMSfxIndex,
 	lolIngameMT32SfxIndex,
+	//lolIngameADLSfxIndex,
 	lolSpellProperties,
 	lolGameShapeMap,
 	lolLevelShpList,
@@ -245,6 +246,21 @@
 	lolDscOvlIndex,
 	lolDscBlockIndex,
 
+	lolScrollXTop,
+	lolScrollYTop,
+	lolScrollXBottom,
+	lolScrollYBottom,
+
+	lolButtonDefs,
+	lolButtonList1,
+	lolButtonList2,
+	lolButtonList3,
+	lolButtonList4,
+	lolButtonList5,
+	lolButtonList6,
+	lolButtonList7,
+	lolButtonList8,
+
 	kMaxResIDs
 };
 
@@ -275,6 +291,7 @@
 	const SpellProperty *loadSpellData(int id, int &entries);
 	const CompassDef *loadCompassData(int id, int &entries);
 	const uint16 *loadRawDataBe16(int id, int &entries);
+	const ButtonDef *loadButtonDefs(int id, int &entries);
 
 	// use '-1' to prefetch/unload all ids
 	// prefetchId retruns false if only on of the resources
@@ -309,7 +326,8 @@
 	bool loadCharData(const char *filename, void *&ptr, int &size);
 	bool loadSpellData(const char *filename, void *&ptr, int &size);
 	bool loadCompassData(const char *filename, void *&ptr, int &size);
-	bool loadRawDataBe16(const char *filename, void *&ptr, int &size);	
+	bool loadRawDataBe16(const char *filename, void *&ptr, int &size);
+	bool loadButtonDefs(const char *filename, void *&ptr, int &size);
 
 	void freeRawData(void *&ptr, int &size);
 	void freeStringTable(void *&ptr, int &size);
@@ -323,6 +341,7 @@
 	void freeSpellData(void *&ptr, int &size);
 	void freeCompassData(void *&ptr, int &size);
 	void freeRawDataBe16(void *&ptr, int &size);
+	void freeButtonDefs(void *&ptr, int &size);
 
 	const char *getFilename(const char *name);
 	Common::SeekableReadStream *getFile(const char *name);
@@ -342,7 +361,8 @@
 		lolCharData,
 		lolSpellData,
 		lolCompassData,
-		lolRawDataBe16
+		lolRawDataBe16,
+		lolButtonData
 	};
 
 	struct BuiltinRes {

Modified: scummvm/trunk/engines/kyra/scene_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene_lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/scene_lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -59,7 +59,7 @@
 	_currentLevel = index;
 	_updateFlags = 0;
 
-	// TODO
+	restoreDefaultGui();
 
 	loadTalkFile(index);
 
@@ -84,7 +84,7 @@
 
 	_screen->generateGrayOverlay(_screen->_currentPalette, _screen->_grayOverlay,32, 16, 0, 0, 128, true);
 
-	_loadLevelFlag2 = false;
+	_sceneDefaultUpdate = 0;
 	if (_screen->_fadeFlag == 3)
 		_screen->fadeToBlack(10);
 
@@ -160,7 +160,7 @@
 			cmzS3(l);
 			if (_currentLevel != 29)
 				initCMZ1(l, 14);
-			runResidentScriptCustom(0x404, -1, l->field_16, l->field_16, 0, 0);
+			runSceneScriptCustom(0x404, -1, l->field_16, l->field_16, 0, 0);
 			checkScriptUnk(l->blockPropertyIndex);
 			if (l->field_14 == 14)
 				initCMZ2(l, 0, 0);
@@ -202,7 +202,7 @@
 		return;
 
 	if (l->blockPropertyIndex != t)
-		runResidentScriptCustom(l->blockPropertyIndex, 0x800, -1, l->field_16, 0, 0);
+		runSceneScriptCustom(l->blockPropertyIndex, 0x800, -1, l->field_16, 0, 0);
 
 	if (_updateFlags & 1)
 		return;
@@ -767,6 +767,21 @@
 	}
 }
 
+bool LoLEngine::testWallFlag(int block, int direction, int flag) {
+	if (_levelBlockProperties[block].flags & 0x10)
+		return true;
+
+	if (direction != -1)		
+		return (_wllWallFlags[_levelBlockProperties[block].walls[direction ^ 2]] & flag) ? true : false;
+
+	for (int i = 0; i < 4; i++) {
+		if (_wllWallFlags[_levelBlockProperties[block].walls[i]] & flag)
+			return true;
+	}
+
+	return false;	
+}
+
 bool LoLEngine::testWallInvisibility(int block, int direction) {
 	uint8 w = _levelBlockProperties[block].walls[direction];
 	if (_wllVmpMap[w] || _wllShapeMap[w] || _levelBlockProperties[block].flags & 0x80)
@@ -838,10 +853,63 @@
 	
 }
 
-void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int unk3) {
-	// TODO
-	_currentBlock = calcNewBlockPostion(_currentBlock, direction);
-	// XXXX
+void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape) {
+	if (buttonShape)
+		gui_toggleButtonDisplayMode(buttonShape, 1);
+
+	uint16 opos = _currentBlock;
+	uint16 npos = calcNewBlockPostion(_currentBlock, direction);
+	
+	if (!checkBlockPassability(npos, direction)) {
+		notifyBlockNotPassable(unk2 ? 0 : 1);
+		gui_toggleButtonDisplayMode(buttonShape, 0);
+		return;
+	}
+
+	_scriptDirection = direction;
+	_currentBlock = npos;
+	_sceneDefaultUpdate = 1;
+
+	calcCoordinates(_partyPosX, _partyPosY, opos, 0x80, 0x80);
+	_unkFlag &= 0xfdff;
+	
+	runSceneScript(opos, 4);
+	runSceneScript(npos, 1);
+
+	if (!(_unkFlag & 0x200)) {
+		updatePortraitUnkTimeSub(2, 0);
+
+		if (_sceneDefaultUpdate) {
+			switch (unk2) {
+				case 0:
+					movePartySmoothScrollUp(2);
+					break;
+				case 1:
+					movePartySmoothScrollDown(2);
+					break;
+				case 2:
+					movePartySmoothScrollLeft(1);
+					break;
+				case 3:
+					movePartySmoothScrollRight(1);
+					break;
+				default:
+					break;
+			}
+		} else {
+			gui_drawScene(0);
+		}
+
+		gui_toggleButtonDisplayMode(buttonShape, 0);
+
+		runSceneScript(opos, 8);
+		runSceneScript(npos, 2);
+
+		if (_levelBlockProperties[npos].walls[0] == 0x1a)
+			memset(_levelBlockProperties[npos].walls, 0, 4);
+	}
+
+	setLF2(_currentBlock);
 }
 
 uint16 LoLEngine::calcNewBlockPostion(uint16 curBlock, uint16 direction) {
@@ -849,6 +917,308 @@
 	return (curBlock + blockPosTable[direction]) & 0x3ff;
 }
 
+bool LoLEngine::checkBlockPassability(uint16 block, uint16 direction) {
+	if (testWallFlag(block, direction, 1))
+		return false;
+
+	uint16 d = _levelBlockProperties[block].itemIndex;
+
+	while (d) {
+		if (d & 0x8000)
+			return false;
+		d = findItem(d)->itemIndexUnk;
+	}
+
+	return true;
+}
+
+void LoLEngine::notifyBlockNotPassable(int scrollFlag) {
+	if (scrollFlag)
+		movePartySmoothScrollBlocked(2);
+
+	snd_dialogueSpeechUpdate(1);
+	_txt->printMessage(0x8002, getLangString(0x403f));
+	snd_playSoundEffect(19, 255);
+}
+
+void LoLEngine::movePartySmoothScrollBlocked(int speed) {
+	if (!(_unkGameFlag & 8) || ((_unkGameFlag & 8) && _hideInventory))
+		return;
+
+	_screen->backupSceneWindow(_sceneDrawPage2 == 2 ? 2 : 6, 6);
+
+	for (int i = 0; i < 2; i++) {
+		_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+		_screen->smoothScrollZoomStepTop(6, 2, _scrollXTop[i], _scrollYTop[i]);
+		_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
+		_screen->restoreSceneWindow(2, 0);
+		_screen->updateScreen();
+		fadeText();		
+		delayUntil(_smoothScrollTimer);
+		if (!_smoothScrollModeNormal)
+			i++;
+	}
+
+	for (int i = 2; i; i--) {
+		_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+		_screen->smoothScrollZoomStepTop(6, 2, _scrollXTop[i], _scrollYTop[i]);
+		_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
+		_screen->restoreSceneWindow(2, 0);
+		_screen->updateScreen();
+		fadeText();		
+		delayUntil(_smoothScrollTimer);
+		if (!_smoothScrollModeNormal)
+			i++;
+	}
+
+	if (_sceneDefaultUpdate != 2) {
+		_screen->restoreSceneWindow(6, 0);
+		_screen->updateScreen();
+	}
+
+	updateSceneWindow();
+}
+
+void LoLEngine::movePartySmoothScrollUp(int speed) {
+	if (!(_unkGameFlag & 8) || ((_unkGameFlag & 8) && _hideInventory))
+		return;
+
+	int d = 0;
+
+	if (_sceneDrawPage2 == 2) {
+		d = smoothScrollDrawSpecialShape(6);
+		gui_drawScene(6);
+		_screen->copyRegionToBuffer(6, 112, 0, 176, 120, _scrollSceneBuffer);
+		_screen->backupSceneWindow(2, 6);
+	} else {
+		d = smoothScrollDrawSpecialShape(2);
+		gui_drawScene(2);
+		_screen->copyRegionToBuffer(2, 112, 0, 176, 120, _scrollSceneBuffer);
+		_screen->backupSceneWindow(6, 6);
+	}
+	
+	for (int i = 0; i < 5; i++) {
+		_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+		_screen->smoothScrollZoomStepTop(6, 2, _scrollXTop[i], _scrollYTop[i]);
+		_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
+
+		//if (d)
+		//	unk(_tempBuffer5120, page2);
+		
+		_screen->restoreSceneWindow(2, 0);
+		_screen->updateScreen();
+		fadeText();
+		delayUntil(_smoothScrollTimer);
+		if (!_smoothScrollModeNormal)
+			i++;
+	}
+
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+
+	if (_sceneDefaultUpdate != 2) {
+		_screen->copyBlockToPage(0, 112, 0, 176, 120, _scrollSceneBuffer);
+		_screen->updateScreen();
+	}
+
+	updateSceneWindow();
+}
+
+void LoLEngine::movePartySmoothScrollDown(int speed) {
+	if (!(_unkGameFlag & 8))
+		return;
+
+	//int d = smoothScrollDrawSpecialShape(2);
+	gui_drawScene(2);
+	_screen->backupSceneWindow(2, 6);
+
+	for (int i = 4; i >= 0; i--) {
+		_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+		_screen->smoothScrollZoomStepTop(6, 2, _scrollXTop[i], _scrollYTop[i]);
+		_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
+
+		//if (d)
+		//	unk(_tempBuffer5120, page2);
+		
+		_screen->restoreSceneWindow(2, 0);
+		_screen->updateScreen();
+		fadeText();
+		delayUntil(_smoothScrollTimer);
+		if (!_smoothScrollModeNormal)
+			i++;
+	}
+
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+
+	if (_sceneDefaultUpdate != 2) {
+		_screen->restoreSceneWindow(6, 0);
+		_screen->updateScreen();
+	}
+
+	updateSceneWindow();
+}
+
+void LoLEngine::movePartySmoothScrollLeft(int speed) {
+	if (!(_unkGameFlag & 8))
+		return;
+
+	speed <<= 1;
+
+	gui_drawScene(_sceneDrawPage1);
+
+	for (int i = 88, d = 88; i > 22; i -= 22, d += 22) {
+		_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+		_screen->smoothScrollHorizontalStep(_sceneDrawPage2, 66, d, i);
+		_screen->copyRegion(112 + i, 0, 112, 0, d, 120, _sceneDrawPage1, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
+		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage2, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
+		fadeText();
+		delayUntil(_smoothScrollTimer);
+	}
+
+	if (_sceneDefaultUpdate != 2) {
+		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
+	}
+
+	SWAP(_sceneDrawPage1, _sceneDrawPage2);
+}
+
+void LoLEngine::movePartySmoothScrollRight(int speed) {
+	if (!(_unkGameFlag & 8))
+		return;
+
+	speed <<= 1;
+
+	gui_drawScene(_sceneDrawPage1);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->copyRegion(112, 0, 222, 0, 66, 120, _sceneDrawPage1, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
+	_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage2, 0, Screen::CR_NO_P_CHECK);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollHorizontalStep(_sceneDrawPage2, 22, 0, 66);
+	_screen->copyRegion(112, 0, 200, 0, 88, 120, _sceneDrawPage1, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
+	_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage2, 0, Screen::CR_NO_P_CHECK);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollHorizontalStep(_sceneDrawPage2, 44, 0, 22);
+	_screen->copyRegion(112, 0, 178, 0, 110, 120, _sceneDrawPage1, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
+	_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage2, 0, Screen::CR_NO_P_CHECK);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	if (_sceneDefaultUpdate != 2) {
+		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
+	}
+
+	SWAP(_sceneDrawPage1, _sceneDrawPage2);
+}
+
+void LoLEngine::movePartySmoothScrollTurnLeft(int speed) {
+	if (!(_unkGameFlag & 8))
+		return;
+
+	speed <<= 1;
+
+	//int d = smoothScrollDrawSpecialShape(_sceneDrawPage1);
+	gui_drawScene(_sceneDrawPage1);
+	int dp = _sceneDrawPage2 == 2 ? _sceneDrawPage2 : _sceneDrawPage1;
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep1(_sceneDrawPage1, _sceneDrawPage2, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep2(_sceneDrawPage1, _sceneDrawPage2, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep3(_sceneDrawPage1, _sceneDrawPage2, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	if (_sceneDefaultUpdate != 2) {
+		drawScriptShapes(_sceneDrawPage1);
+		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
+	}
+}
+
+void LoLEngine::movePartySmoothScrollTurnRight(int speed) {
+	if (!(_unkGameFlag & 8))
+		return;
+
+	speed <<= 1;
+
+	//int d = smoothScrollDrawSpecialShape(_sceneDrawPage1);
+	gui_drawScene(_sceneDrawPage1);
+	int dp = _sceneDrawPage2 == 2 ? _sceneDrawPage2 : _sceneDrawPage1;
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep3(_sceneDrawPage2, _sceneDrawPage1, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep2(_sceneDrawPage2, _sceneDrawPage1, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
+	_screen->smoothScrollTurnStep1(_sceneDrawPage2, _sceneDrawPage1, dp);
+	//if (d)
+	//	unk(_tempBuffer5120, _scrollSceneBuffer);
+	_screen->restoreSceneWindow(dp, 0);
+	_screen->updateScreen();
+	fadeText();
+	delayUntil(_smoothScrollTimer);
+
+	if (_sceneDefaultUpdate != 2) {
+		drawScriptShapes(_sceneDrawPage1);
+		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, 0, Screen::CR_NO_P_CHECK);
+		_screen->updateScreen();
+	}
+}
+
+int LoLEngine::smoothScrollDrawSpecialShape(int pageNum) {
+	// TODO
+	if(!_scriptAssignedLevelShape)
+		return 0;
+	return 0;
+}
+
 void LoLEngine::setLF2(int block) {
 	if (!(_screen->_drawGuiFlag & 0x1000))
 		return;		
@@ -858,16 +1228,12 @@
 
 void LoLEngine::drawScene(int pageNum) {
 	if (pageNum && pageNum != _sceneDrawPage1) {
-		_sceneDrawPage1 ^= _sceneDrawPage2;
-		_sceneDrawPage2 ^= _sceneDrawPage1;
-		_sceneDrawPage1 ^= _sceneDrawPage2;
+		SWAP(_sceneDrawPage1, _sceneDrawPage2);
 		updateSceneWindow();
 	}
 
 	if (pageNum && pageNum != _sceneDrawPage1) {
-		_sceneDrawPage1 ^= _sceneDrawPage2;
-		_sceneDrawPage2 ^= _sceneDrawPage1;
-		_sceneDrawPage1 ^= _sceneDrawPage2;
+		SWAP(_sceneDrawPage1, _sceneDrawPage2);
 		updateSceneWindow();
 	}
 
@@ -879,9 +1245,7 @@
 		drawScriptShapes(_sceneDrawPage1);
 		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
 		_screen->copyRegion(112, 0, 112, 0, 176, 120, _sceneDrawPage1, 0, Screen::CR_NO_P_CHECK);
-		_sceneDrawPage1 ^= _sceneDrawPage2;
-		_sceneDrawPage2 ^= _sceneDrawPage1;
-		_sceneDrawPage1 ^= _sceneDrawPage2;
+		SWAP(_sceneDrawPage1, _sceneDrawPage2);
 	}
 
 	runLoopSub4(0);
@@ -896,6 +1260,21 @@
 	_screen->showMouse();
 }
 
+void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) {
+	gui_enableSequenceButtons(x, y, w, h, enableFlags);
+	int offs = _itemInHand ? 10 : 0;
+	_screen->setMouseCursor(offs, offs, getItemIconShapePtr(_itemInHand));
+	setLampMode(0);
+	_lampStatusSuspended = true;
+}
+
+void LoLEngine::restoreDefaultGui() {
+	gui_enableDefaultPlayfieldButtons();
+	if (_lampStatusSuspended)
+		resetLampStatus();
+	_lampStatusSuspended = false;
+}
+
 void LoLEngine::generateBlockDrawingBuffer(int block, int direction) {
 	_sceneDrawVar1 = _dscBlockMap[_currentDirection];
 	_sceneDrawVar2 = _dscBlockMap[_currentDirection + 4];
@@ -905,7 +1284,7 @@
 
 	_wllProcessFlag = ((block >> 5) + (block & 0x1f) + _currentDirection) & 1;
 
-	if (_wllProcessFlag)
+	if (_wllProcessFlag) // floor and ceiling
 		generateBlockDrawingBufferF1(0, 15, 1, -330, 22, 15);
 	else
 		generateBlockDrawingBufferF0(0, 15, 1, -330, 22, 15);
@@ -1014,10 +1393,10 @@
 
 	t = _curBlockCaps[15]->walls[_sceneDrawVar2];
 	t2 = _curBlockCaps[17]->walls[_sceneDrawVar3];
-	if (t)
+	if (t)	// wall to the immediate left
 		generateBlockDrawingBufferF0(0, 0, t, 0, 3, 15);
-	if (t2)
-		generateBlockDrawingBufferF1(19, 0, t, 0, 3, 15);
+	if (t2) // wall to the immediate right
+		generateBlockDrawingBufferF1(19, 0, t2, 0, 3, 15);
 }
 
 void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) {
@@ -1045,17 +1424,19 @@
 
 	for (int i = 0; i < numEntries; i++) {
 		for (int ii = 0; ii < len; ii++) {
-			if ((wllOffset + ii >= 0) && (wllOffset + ii < 22)) {
-				uint16 t = vmp[len * i + len - 1 - ii];
-				if (t) {				
-					if (t & 04000)
-						t -= 0x4000;
-					else
-						t |= 0x4000;
+			if ((wllOffset + ii) < 0 || (wllOffset + ii) > 21)
+				continue;
 
-					_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset + ii] = t;
-				}
-			}
+			uint16 v = vmp[i * len + (len - 1 - ii)];
+			if (!v)
+				continue;
+
+			if (v & 0x4000)
+				v -= 0x4000;
+			else
+				v |= 0x4000;
+
+			_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset + ii] = v;
 		}
 	}
 }
@@ -1069,7 +1450,7 @@
 void LoLEngine::assignBlockCaps(int block, int direction) {
 	for (int i = 0; i < 18; i++) {
 		uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3ff;
-		_scriptExecutedFuncs[i] = t;
+		_currentBlockPropertyIndex[i] = t;
 
 		_curBlockCaps[i] = &_levelBlockProperties[t];
 		_lvlShapeLeftRight[i] = _lvlShapeLeftRight[18 + i] = -1;
@@ -1482,7 +1863,8 @@
 }
 
 void LoLEngine::drawScriptShapes(int pageNum) {
-	// TODO
+	if (!_scriptAssignedLevelShape)
+		return;
 }
 
 } // end of namespace Kyra

Modified: scummvm/trunk/engines/kyra/screen_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen_lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/screen_lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -298,6 +298,236 @@
 	_fadeFlag = 1;
 }
 
+void Screen_LoL::backupSceneWindow(int srcPageNum, int dstPageNum) {
+	uint8 *src = getPagePtr(srcPageNum) + 112;
+	uint8 *dst = getPagePtr(dstPageNum) + 0xa500;
+
+	for (int h = 0; h < 120; h++) {
+		for (int w = 0; w < 176; w++)
+			*dst++ = *src++;
+		src += 144;
+	}
+}
+
+void Screen_LoL::restoreSceneWindow(int srcPageNum, int dstPageNum) {
+	uint8 *src = getPagePtr(srcPageNum) + 0xa500;
+	uint8 *dst = getPagePtr(dstPageNum) + 112;
+
+	for (int h = 0; h < 120; h++) {
+		memcpy(dst, src, 176);
+		src += 176;
+		dst += 320;
+	}
+
+	if (!dstPageNum)
+		addDirtyRect(112, 0, 176, 120);
+}
+
+void Screen_LoL::smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, int y) {
+	uint8 *src = getPagePtr(srcPageNum) + 0xa500 + y * 176 + x;
+	uint8 *dst = getPagePtr(dstPageNum) + 0xa500;
+
+	x <<= 1;
+	uint16 width = 176 - x;
+	uint16 scaleX = (((x + 1) << 8) / width + 0x100);
+	uint16 cntW = scaleX >> 8;
+	scaleX <<= 8;
+	width--;
+	uint16 widthCnt = width;
+
+	uint16 height = 46 - y;
+	uint16 scaleY = (((y + 1) << 8) / height + 0x100);
+	scaleY <<= 8;
+
+	uint32 scaleYc = 0;
+	while (height) {
+		uint32 scaleXc = 0;
+		do {
+			scaleXc += scaleX;
+			int numbytes = cntW + (scaleXc >> 16);
+			scaleXc &= 0xffff;
+			memset(dst, *src++, numbytes);
+			dst += numbytes;
+		} while (--widthCnt);
+
+		*dst++ = *src++;
+		widthCnt = width;
+
+		src += x;
+		scaleYc += scaleY;
+
+		if (scaleYc >> 16) {
+			scaleYc = 0;
+			src -= 176;
+			continue;
+		}
+
+		height--;
+	}
+}
+
+void Screen_LoL::smoothScrollZoomStepBottom(int srcPageNum, int dstPageNum, int x, int y) {
+	uint8 *src = getPagePtr(srcPageNum) + 0xc4a0 + x;
+	uint8 *dst = getPagePtr(dstPageNum) + 0xc4a0;
+
+	x <<= 1;
+	uint16 width = 176 - x;
+	uint16 scaleX = (((x + 1) << 8) / width + 0x100);
+	uint16 cntW = scaleX >> 8;
+	scaleX <<= 8;
+	width--;
+	uint16 widthCnt = width;
+
+	uint16 height = 74 - y;
+	uint16 scaleY = (((y + 1) << 8) / height + 0x100);
+	scaleY <<= 8;
+
+	uint32 scaleYc = 0;
+	while (height) {
+		uint32 scaleXc = 0;
+		do {
+			scaleXc += scaleX;
+			int numbytes = cntW + (scaleXc >> 16);
+			scaleXc &= 0xffff;
+			memset(dst, *src++, numbytes);
+			dst += numbytes;
+		} while (--widthCnt);
+
+		*dst++ = *src++;
+		widthCnt = width;
+
+		src += x;
+		scaleYc += scaleY;
+
+		if (scaleYc >> 16) {
+			scaleYc = 0;
+			src -= 176;
+			continue;
+		}
+
+		height--;
+	}
+}
+
+void Screen_LoL::smoothScrollHorizontalStep(int pageNum, int srcX, int dstX, int w) {
+	uint8 *d = getPagePtr(pageNum);
+	uint8 *s = d + 112 + srcX;
+
+	int w2 = srcX + w - dstX;
+	int pitchS = 320 + w2 - (w << 1);
+
+	int pitchD = 320 - w;
+	int h = 120;
+
+	while (h--) {
+		for (int i = 0; i < w; i++)
+			*d++ = *s++;
+		d -= w;
+		s -= w2;
+
+		for (int i = 0; i < w; i++)
+			*s++ = *d++;
+		
+		s += pitchS;
+		d += pitchD;
+	}
+}
+
+void Screen_LoL::smoothScrollTurnStep1(int srcPage1Num, int srcPage2Num, int dstPageNum) {
+	uint8 *s = getPagePtr(srcPage1Num) + 273;
+	uint8 *d = getPagePtr(dstPageNum) + 0xa500;
+
+	for (int i = 0; i < 120; i++) {
+		uint8 a = *s++;
+		*d++ = a;
+		*d++ = a;
+
+		for (int ii = 0; ii < 14; ii++) {
+			a = *s++;
+			*d++ = a;
+			*d++ = a;
+			*d++ = a;
+		}
+
+		s += 305;
+		d += 132;
+	}
+
+	s = getPagePtr(srcPage2Num) + 112;
+	d = getPagePtr(dstPageNum)  + 0xa52c;
+
+	for (int i = 0; i < 120; i++) {
+		for (int ii = 0; ii < 33; ii++) {
+			*d++ = *s++;
+			*d++ = *s++;
+			uint8 a = *s++;
+			*d++ = a;
+			*d++ = a;
+		}
+
+		s += 221;
+		d += 44;
+	}
+}
+
+void Screen_LoL::smoothScrollTurnStep2(int srcPage1Num, int srcPage2Num, int dstPageNum) {
+	uint8 *s = getPagePtr(srcPage1Num) + 244;
+	uint8 *d = getPagePtr(dstPageNum) + 0xa500;
+
+	for (int k = 0; k < 2; k++) {
+		for (int i = 0; i < 120; i++) {
+			for (int ii = 0; ii < 44; ii++) {
+				uint8 a = *s++;
+				*d++ = a;
+				*d++ = a;
+			}
+
+			s += 276;
+			d += 88;
+		}
+
+		s = getPagePtr(srcPage2Num) + 112;
+		d = getPagePtr(dstPageNum) + 0xa558;
+	}
+}
+
+void Screen_LoL::smoothScrollTurnStep3(int srcPage1Num, int srcPage2Num, int dstPageNum) {
+	uint8 *s = getPagePtr(srcPage1Num) + 189;
+	uint8 *d = getPagePtr(dstPageNum) + 0xa500;
+
+	for (int i = 0; i < 120; i++) {
+		for (int ii = 0; ii < 33; ii++) {
+			*d++ = *s++;
+			*d++ = *s++;
+			uint8 a = *s++;
+			*d++ = a;
+			*d++ = a;
+		}
+
+		s += 221;
+		d += 44;
+	}
+
+	s = getPagePtr(srcPage2Num) + 112;
+	d = getPagePtr(dstPageNum)  + 0xa584;
+
+	for (int i = 0; i < 120; i++) {
+		for (int ii = 0; ii < 14; ii++) {
+			uint8 a = *s++;
+			*d++ = a;
+			*d++ = a;
+			*d++ = a;
+		}
+
+		uint8 a = *s++;
+		*d++ = a;
+		*d++ = a;
+
+		s += 305;
+		d += 132;
+	}
+}
+
 void Screen_LoL::fadeToBlack(int delay, const UpdateFunctor *upFunc) {
 	Screen::fadeToBlack(delay, upFunc);
 	_fadeFlag = 2;
@@ -329,49 +559,61 @@
 	memcpy(destPalette + 0x240, _screenPalette + 0x240, 12);	
 }
 
-void Screen_LoL::loadColour254(uint8 *destPalEntry) {
-	memcpy(destPalEntry, _screenPalette + 0x2fa, 3);
+void Screen_LoL::copyColour(int dstColourIndex, int srcColourIndex) {
+	uint8 *s = _screenPalette + srcColourIndex * 3;
+	uint8 *d = _screenPalette + dstColourIndex * 3;
+	memcpy(d, s, 3);
+
+	uint8 ci[4];
+	ci[0] = (d[0] << 2) | (d[0] & 3);
+	ci[1] = (d[1] << 2) | (d[1] & 3);
+	ci[2] = (d[2] << 2) | (d[2] & 3);
+	ci[3] = 0;
+
+	_system->setPalette(ci, dstColourIndex, 1);
 }
 
-bool Screen_LoL::copyColour(int dstColorIndex, int srcColorIndex, uint32 time1, uint32 time2) {
-	uint8 *s = _screenPalette + 3 * dstColorIndex;
-	uint8 *e = _screenPalette + 3 * srcColorIndex;
-	uint8 *p = getPalette(1) + 3 * dstColorIndex;
+bool Screen_LoL::fadeColour(int dstColourIndex, int srcColourIndex, uint32 elapsedTime, uint32 targetTime) {
+	uint8 *dst = _screenPalette + 3 * dstColourIndex;
+	uint8 *src = _screenPalette + 3 * srcColourIndex;
+	uint8 *p = getPalette(1) + 3 * dstColourIndex;
 
 	bool res = false;
 
-	uint16 t1 = 0;
-	uint16 t2 = 0;
+	int16 t1 = 0;
+	int16 t2 = 0;
 	int32 t3 = 0;
 
 	uint8 tmpPalEntry[3];
 
 	for (int i = 0; i < 3; i++) {
-		if (time1 < time2) {
-			t1 = *e & 0x3f;
-			t2 = *s & 0x3f;
+		if (elapsedTime < targetTime) {
+			t1 = *src & 0x3f;
+			t2 = *dst & 0x3f;
 
 			t3 = t1 - t2;
-			if (!t3)
+			if (t3)
 				res = true;
 
-			t3 = (((((t3 << 8) / time2) * time1) >> 8) & 0xffff) + t2;
+			t3 = (((t3 << 8) / (int)targetTime) * (int)elapsedTime) >> 8;
+			t3 =  t2 + t3;
 		} else {
-			t1 = *e & 0x3f;
+			t1 = *dst & 0x3f;
 			*p = t3 = t1;
 			res = false;
 		}
 
 		tmpPalEntry[i] = t3 & 0xff;
-		s++;
-		e++;
+		src++;
+		dst++;
 		p++;
 	}
 
 	uint8 tpal[768];
 	memcpy(tpal, _screenPalette, 768);
-	memcpy(tpal + dstColorIndex * 3, tmpPalEntry, 3);
+	memcpy(tpal + dstColourIndex * 3, tmpPalEntry, 3);
 	setScreenPalette(tpal);
+	updateScreen();
 
 	return res;
 }

Modified: scummvm/trunk/engines/kyra/screen_lol.h
===================================================================
--- scummvm/trunk/engines/kyra/screen_lol.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/screen_lol.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -50,12 +50,23 @@
 	void drawGridBox(int x, int y, int w, int h, int col);
 	void fadeClearSceneWindow(int delay);
 
+	// smooth scrolling
+	void backupSceneWindow(int srcPageNum, int dstPageNum);
+	void restoreSceneWindow(int srcPageNum, int dstPageNum);
+	void smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, int y);
+	void smoothScrollZoomStepBottom(int srcPageNum, int dstPageNum, int x, int y);
+	void smoothScrollHorizontalStep(int pageNum, int x, int u2, int w);
+	void smoothScrollTurnStep1(int srcPage1Num, int srcPage2Num, int dstPageNum);
+	void smoothScrollTurnStep2(int srcPage1Num, int srcPage2Num, int dstPageNum);
+	void smoothScrollTurnStep3(int srcPage1Num, int srcPage2Num, int dstPageNum);
+
+	// palette stuff
 	void fadeToBlack(int delay=0x54, const UpdateFunctor *upFunc = 0);
 	void setPaletteBrightness(uint8 *palDst, int brightness, int modifier);
 	void generateBrightnessPalette(uint8 *palSrc, uint8 *palDst, int brightness, int modifier);
 	void loadSpecialColours(uint8 *destPalette);
-	void loadColour254(uint8 *destPalEntry);
-	bool copyColour(int dstColorIndex, int srcColorIndex, uint32 time1, uint32 time2);
+	void copyColour(int dstColourIndex, int srcColourIndex);
+	bool fadeColour(int dstColourIndex, int srcColourIndex, uint32 elapsedTime, uint32 targetTime);
 
 	void generateGrayOverlay(const uint8 *srcPal, uint8 *grayOverlay, int factor, int addR, int addG, int addB, int lastColor, bool skipSpecialColours);
 	uint8 *generateLevelOverlay(const uint8 *srcPal, uint8 *ovl, int opColor, int weight);

Modified: scummvm/trunk/engines/kyra/script_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/script_lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -54,34 +54,34 @@
 
 void LoLEngine::runInfScript(const char *filename) {
 	_emc->load(filename, &_scriptData, &_opcodes);
-	runResidentScript(0x400, -1);
+	runSceneScript(0x400, -1);
 }
 
-void LoLEngine::runResidentScript(int func, int reg0) {
-	runResidentScriptCustom(func, reg0, -1, 0, 0, 0);
+void LoLEngine::runSceneScript(int block, int sub) {
+	runSceneScriptCustom(block, sub, -1, 0, 0, 0);
 }
 
-void LoLEngine::runResidentScriptCustom(int func, int reg0, int reg1, int reg2, int reg3, int reg4) {
+void LoLEngine::runSceneScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4) {
 	EMCState scriptState;
 	memset(&scriptState, 0, sizeof(EMCState));
 
 	if (!_scriptBoolSkipExec) {
 		_emc->init(&scriptState, &_scriptData);
-		_emc->start(&scriptState, func);
+		_emc->start(&scriptState, block);
 
-		scriptState.regs[0] = reg0;
-		scriptState.regs[1] = reg1;
-		scriptState.regs[2] = reg2;
+		scriptState.regs[0] = sub;
+		scriptState.regs[1] = charNum;
+		scriptState.regs[2] = item;
 		scriptState.regs[3] = reg3;
 		scriptState.regs[4] = reg4;
-		scriptState.regs[5] = func;
-		scriptState.regs[6] = _unkScriptByte;
+		scriptState.regs[5] = block;
+		scriptState.regs[6] = _scriptDirection;
 
 		while (_emc->isValid(&scriptState))
 			_emc->run(&scriptState);
 	}
 
-	checkScriptUnk(func);
+	checkScriptUnk(block);
 }
 
 bool LoLEngine::checkScriptUnk(int func) {
@@ -89,7 +89,7 @@
 		return true;
 
 	for (int i = 0; i < 15; i++) {
-		if (_scriptExecutedFuncs[i] == func) {
+		if (_currentBlockPropertyIndex[i] == func) {
 			_sceneUpdateRequired = true;
 			return true;
 		}
@@ -420,25 +420,33 @@
 		calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80);
 		setLF2(_currentBlock);			
 		break;
+
 	case 1:
 		_currentDirection = b;
 		break;
+
 	case 2:
 		_currentLevel = b & 0xff;
 		break;
+
 	case 3:
 		break;
+
 	case 4:
 		_brightness = b & 0xff;
 		break;
+
 	case 5:
 		_credits = b;
 		break;
+
 	case 6:
 		//TODO
 		break;
+
 	case 7:			
 		break;
+
 	case 8:
 		_updateFlags = b;
 		if (b == 1) {
@@ -449,19 +457,24 @@
 			setUnkFlags(2);
 		}
 		break;
+
 	case 9:
 		_lampStatusUnk = b & 0xff;
 		break;
+
 	case 10:
-		_loadLevelFlag2 = b & 0xff;
+		_sceneDefaultUpdate = b & 0xff;
 		//TODO
 		break;
+
 	case 11:
 		//TODO
 		break;
+
 	case 12:
 		//TODO
 		break;
+
 	default:
 		break;
 	}
@@ -606,7 +619,7 @@
 	
 	if (!snd_playCharacterSpeech(track, 0, 0) || textEnabled()) {
 		char *s = getLangString(track);
-		_dlg->play(4, s, script, 0, 1);
+		_txt->playDialogue(4, s, script, 0, 1);
 	}
 
 	return 1;

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -44,7 +44,7 @@
 
 namespace Kyra {
 
-#define RESFILE_VERSION 35
+#define RESFILE_VERSION 36
 
 namespace {
 bool checkKyraDat(Common::SeekableReadStream *file) {
@@ -226,6 +226,7 @@
 		{ lolSpellData, proc(loadSpellData), proc(freeSpellData) },
 		{ lolCompassData, proc(loadCompassData), proc(freeCompassData) },
 		{ lolRawDataBe16, proc(loadRawDataBe16), proc(freeRawDataBe16) },
+		{ lolButtonData, proc(loadButtonDefs), proc(freeButtonDefs) },
 
 		{ 0, 0, 0 }
 	};
@@ -375,6 +376,7 @@
 		{ lolMusicTrackMap, kRawData, "MUSIC.MAP" },
 		{ lolIngameGMSfxIndex, kRawData, "SFX_GM.MAP" },
 		{ lolIngameMT32SfxIndex, kRawData, "SFX_MT32.MAP" },
+		//{ lolIngameADLSfxIndex, kRawData, "SFX_ADL.MAP" },
 		{ lolSpellProperties, lolSpellData, "SPELLS.DEF" },
 		{ lolGameShapeMap, kRawData, "GAMESHP.MAP" },
 		{ lolLevelShpList, kStringList, "SHPFILES.TXT" },
@@ -403,6 +405,21 @@
 		{ lolDscDoorX, lolRawDataBe16, "DSCDOORX.DEF" },
 		{ lolDscDoorY, lolRawDataBe16, "DSCDOORY.DEF" },
 
+		{ lolScrollXTop, kRawData, "SCROLLXT.DEF" },
+		{ lolScrollYTop, kRawData, "SCROLLYT.DEF" },
+		{ lolScrollXBottom, kRawData, "SCROLLXB.DEF" },
+		{ lolScrollYBottom, kRawData, "SCROLLYB.DEF" },
+
+		{ lolButtonDefs, lolButtonData, "BUTTONS.DEF" },
+		{ lolButtonList1, lolRawDataBe16, "BUTTON1.LST" },
+		{ lolButtonList2, lolRawDataBe16, "BUTTON2.LST" },
+		{ lolButtonList3, lolRawDataBe16, "BUTTON3.LST" },
+		{ lolButtonList4, lolRawDataBe16, "BUTTON4.LST" },
+		{ lolButtonList5, lolRawDataBe16, "BUTTON5.LST" },
+		{ lolButtonList6, lolRawDataBe16, "BUTTON6.LST" },
+		{ lolButtonList7, lolRawDataBe16, "BUTTON7.LST" },
+		{ lolButtonList8, lolRawDataBe16, "BUTTON84.LST" },
+
 		{ 0, 0, 0 }
 	};
 
@@ -482,6 +499,10 @@
 	return (const uint16*)getData(id, lolRawDataBe16, entries);
 }
 
+const ButtonDef *StaticResource::loadButtonDefs(int id, int &entries) {
+	return (const ButtonDef*)getData(id, lolButtonData, entries);
+}
+
 bool StaticResource::prefetchId(int id) {
 	if (id == -1) {
 		for (int i = 0; _filenameTable[i].filename; ++i)
@@ -1048,6 +1069,31 @@
 	return true;
 }
 
+bool StaticResource::loadButtonDefs(const char *filename, void *&ptr, int &size) {
+	Common::SeekableReadStream *file = getFile(filename);
+
+	size = file->size() / 18;
+
+	ButtonDef *r = new ButtonDef[size];
+
+	for (int i = 0; i < size; i++) {
+		r[i].buttonflags = file->readUint16BE();
+		r[i].clickedShapeId = file->readByte();
+		file->readByte();
+		r[i].unk2 = file->readUint16BE();
+		r[i].x = file->readSint16BE();
+		r[i].y = file->readSint16BE();
+		r[i].w = file->readUint16BE();
+		r[i].h = file->readUint16BE();
+		r[i].index = file->readUint16BE();
+		r[i].screenDim = file->readUint16BE();
+	}
+	
+	ptr = r;
+	
+	return true;
+}
+
 void StaticResource::freeRawData(void *&ptr, int &size) {
 	uint8 *data = (uint8*)ptr;
 	delete[] data;
@@ -1144,6 +1190,13 @@
 	size = 0;
 }
 
+void StaticResource::freeButtonDefs(void *&ptr, int &size) {
+	ButtonDef *d = (ButtonDef*)ptr;
+	delete[] d;
+	ptr = 0;
+	size = 0;
+}
+
 void StaticResource::freePaletteTable(void *&ptr, int &size) {
 	uint8 **data = (uint8**)ptr;
 	while (size--)
@@ -1633,6 +1686,7 @@
 	_musicTrackMap = _staticres->loadRawData(lolMusicTrackMap, _musicTrackMapSize);
 	_ingameGMSoundIndex = _staticres->loadRawData(lolIngameGMSfxIndex, _ingameGMSoundIndexSize);
 	_ingameMT32SoundIndex = _staticres->loadRawData(lolIngameMT32SfxIndex, _ingameMT32SoundIndexSize);
+	//_ingameADLSoundIndex = _staticres->loadRawData(lolIngameADLSfxIndex, _ingameADLSoundIndexSize);
 	_spellProperties = _staticres->loadSpellData(lolSpellProperties, _spellPropertiesSize);
 	_gameShapeMap = (const int8*)_staticres->loadRawData(lolGameShapeMap, _gameShapeMapSize);
 	_levelShpList = _staticres->loadStrings(lolLevelShpList, _levelShpListSize);
@@ -1642,25 +1696,30 @@
 	_dscUnk1 = (const int8*)_staticres->loadRawData(lolDscUnk1, _dscUnk1Size);
 	_dscShapeIndex = (const int8*)_staticres->loadRawData(lolDscShapeIndex, _dscShapeIndexSize);
 	_dscOvlMap = _staticres->loadRawData(lolDscOvlMap, _dscOvlMapSize);
-	_dscShapeScaleW = (const uint16 *)_staticres->loadRawDataBe16(lolDscScaleWidthData, _dscShapeScaleWSize);
-	_dscShapeScaleH = (const uint16 *)_staticres->loadRawDataBe16(lolDscScaleHeightData, _dscShapeScaleHSize);
-	_dscShapeX = (const int16 *)_staticres->loadRawDataBe16(lolDscX, _dscShapeXSize);
-	_dscShapeY = (const int8 *)_staticres->loadRawData(lolDscY, _dscShapeYSize);
+	_dscShapeScaleW = _staticres->loadRawDataBe16(lolDscScaleWidthData, _dscShapeScaleWSize);
+	_dscShapeScaleH = _staticres->loadRawDataBe16(lolDscScaleHeightData, _dscShapeScaleHSize);
+	_dscShapeX = (const int16*)_staticres->loadRawDataBe16(lolDscX, _dscShapeXSize);
+	_dscShapeY = (const int8*)_staticres->loadRawData(lolDscY, _dscShapeYSize);
 	_dscTileIndex = _staticres->loadRawData(lolDscTileIndex, _dscTileIndexSize);
 	_dscUnk2 = _staticres->loadRawData(lolDscUnk2, _dscUnk2Size);
 	_dscDoorShpIndex = _staticres->loadRawData(lolDscDoorShapeIndex, _dscDoorShpIndexSize);
-	_dscDim1 = (const int8 *)_staticres->loadRawData(lolDscDimData1, _dscDim1Size);
-	_dscDim2 = (const int8 *)_staticres->loadRawData(lolDscDimData2, _dscDim2Size);
+	_dscDim1 = (const int8*)_staticres->loadRawData(lolDscDimData1, _dscDim1Size);
+	_dscDim2 = (const int8*)_staticres->loadRawData(lolDscDimData2, _dscDim2Size);
 	_dscBlockMap = _staticres->loadRawData(lolDscBlockMap, _dscBlockMapSize);
 	_dscDimMap = _staticres->loadRawData(lolDscDimMap, _dscDimMapSize);
-	_dscDoorMonsterScaleTable = (const uint16 *)_staticres->loadRawDataBe16(lolDscDoorScale, _dscDoorMonsterScaleTableSize);
+	_dscDoorMonsterScaleTable = _staticres->loadRawDataBe16(lolDscDoorScale, _dscDoorMonsterScaleTableSize);
 	_dscShapeOvlIndex = _staticres->loadRawData(lolDscOvlIndex, _dscShapeOvlIndexSize);
-	_dscDoor4 = (const uint16 *)_staticres->loadRawDataBe16(lolDscDoor4, _dscDoor4Size);
-	_dscBlockIndex = (const int8 *)_staticres->loadRawData(lolDscBlockIndex, _dscBlockIndexSize);
+	_dscDoor4 = _staticres->loadRawDataBe16(lolDscDoor4, _dscDoor4Size);
+	_dscBlockIndex = (const int8*)_staticres->loadRawData(lolDscBlockIndex, _dscBlockIndexSize);
 	_dscDoor1 = _staticres->loadRawData(lolDscDoor1, _dscDoor1Size);
-	_dscDoorMonsterX = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorX, _dscDoorMonsterXSize);
-	_dscDoorMonsterY = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorY, _dscDoorMonsterYSize);
+	_dscDoorMonsterX = (const int16*)_staticres->loadRawDataBe16(lolDscDoorX, _dscDoorMonsterXSize);
+	_dscDoorMonsterY = (const int16*)_staticres->loadRawDataBe16(lolDscDoorY, _dscDoorMonsterYSize);
 
+	_scrollXTop = _staticres->loadRawData(lolScrollXTop, _scrollXTopSize);
+	_scrollYTop = _staticres->loadRawData(lolScrollYTop, _scrollYTopSize);
+	_scrollXBottom = _staticres->loadRawData(lolScrollXBottom, _scrollXBottomSize);
+	_scrollYBottom = _staticres->loadRawData(lolScrollYBottom, _scrollYBottomSize);
+
 	const char *const *tmpSndList = _staticres->loadStrings(lolIngameSfxFiles, _ingameSoundListSize);
 	_ingameSoundList = new char*[_ingameSoundListSize];
 	for (int i = 0; i < _ingameSoundListSize; i++) {
@@ -1668,8 +1727,122 @@
 		strcpy(_ingameSoundList[i], tmpSndList[i]);
 	}
 	_staticres->unloadId(lolIngameSfxFiles);
+
+	_buttonData = _staticres->loadButtonDefs(lolButtonDefs, _buttonDataSize);
+	_buttonList1 = (const int16*)_staticres->loadRawDataBe16(lolButtonList1, _buttonList1Size);
+	_buttonList2 = (const int16*)_staticres->loadRawDataBe16(lolButtonList2, _buttonList2Size);
+	_buttonList3 = (const int16*)_staticres->loadRawDataBe16(lolButtonList3, _buttonList3Size);
+	_buttonList4 = (const int16*)_staticres->loadRawDataBe16(lolButtonList4, _buttonList4Size);
+	_buttonList5 = (const int16*)_staticres->loadRawDataBe16(lolButtonList5, _buttonList5Size);
+	_buttonList6 = (const int16*)_staticres->loadRawDataBe16(lolButtonList6, _buttonList6Size);
+	_buttonList7 = (const int16*)_staticres->loadRawDataBe16(lolButtonList7, _buttonList7Size);
+	_buttonList8 = (const int16*)_staticres->loadRawDataBe16(lolButtonList8, _buttonList8Size);
 }
 
+void LoLEngine::assignButtonCallback(Button *button, int index) {
+#define cb(x) BUTTON_FUNCTOR(LoLEngine, this, &LoLEngine::x)
+	static Button::Callback buttonCallbacks[] = {
+		cb(clickedUpArrow),
+		cb(clickedDownArrow),
+		cb(clickedDownArrow),
+		cb(clickedLeftArrow),
+		cb(clickedRightArrow),
+		cb(clickedTurnLeftArrow),
+		cb(clickedTurnRightArrow),
+		cb(clickedAttackButton),
+		cb(clickedAttackButton),
+		cb(clickedAttackButton),
+		cb(clickedAttackButton),
+		cb(clickedMagicButton),
+		cb(clickedMagicButton),
+		cb(clickedMagicButton),
+		cb(clickedMagicButton),
+		cb(clickedUnk9),
+		cb(clickedScreen),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedPortraitLeft),
+		cb(clickedLiveMagicBarsLeft),
+		cb(clickedLiveMagicBarsLeft),
+		cb(clickedLiveMagicBarsLeft),
+		cb(clickedLiveMagicBarsLeft),
+		cb(clickedPortraitEtcRight),
+		cb(clickedPortraitEtcRight),
+		cb(clickedPortraitEtcRight),
+		cb(clickedPortraitEtcRight),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk14),
+		cb(clickedUnk15),
+		cb(clickedUnk16),
+		cb(clickedUnk16),
+		cb(clickedUnk16),
+		cb(clickedUnk16),
+		cb(clickedUnk17),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventorySlot),
+		cb(clickedInventoryScroll),
+		cb(clickedInventoryScroll),
+		cb(clickedUnk20),
+		cb(clickedUnk20),
+		cb(clickedScene),
+		cb(clickedUpArrow),
+		cb(clickedDownArrow),
+		cb(clickedLeftArrow),
+		cb(clickedRightArrow),
+		cb(clickedTurnLeftArrow),
+		cb(clickedTurnRightArrow),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedScroll),
+		cb(clickedUnk23),
+		cb(clickedUnk23),
+		cb(clickedUnk23),
+		cb(clickedUnk23),
+		cb(clickedUnk24),
+		cb(clickedUnk25),
+		cb(clickedUnk25),
+		cb(clickedOptions),
+		cb(clickedRestParty),
+		cb(clickedMoneyBox),
+		cb(clickedCompass),
+		cb(clickedAutomap),
+		cb(clickedLamp),
+		cb(clickedUnk32),
+	};
+#undef cb
+
+	button->buttonCallback = buttonCallbacks[index];	
+}
+
 const ScreenDim Screen_LoK::_screenDimTable[] = {
 	{ 0x00, 0x00, 0x28, 0xC8, 0x0F, 0x0C, 0x00, 0x00 },
 	{ 0x08, 0x48, 0x18, 0x38, 0x0F, 0x0C, 0x00, 0x00 },
@@ -2627,10 +2800,6 @@
 
 }
 
-void LoLEngine::initButtonList() {
-	
-}
-
 const ScreenDim Screen_LoL::_screenDimTable[] = {
 	{ 0x00, 0x00, 0x28, 0xC8, 0xC7, 0xCF, 0x00, 0x00 },	// Taken from Intro
 	{ 0x08, 0x48, 0x18, 0x38, 0xFE, 0x01, 0x00, 0x00 },

Modified: scummvm/trunk/engines/kyra/text_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_lol.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/text_lol.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -97,8 +97,8 @@
 
 void TextDisplayer_LoL::expandField() {
 	if (_vm->textEnabled()) {
-		_vm->_restorePalette = 0;
-		_vm->_updateCharV4 = 0;
+		_vm->_fadeText = false;
+		_vm->_textColourFlag = 0;
 		//_vm->toggleGuiUnk(11, 0);
 		_screen->clearDim(3);
 		_screen->copyRegionToBuffer(3, 0, 0, 320, 200, _pageBuffer1);
@@ -137,30 +137,32 @@
 	}
 }
 
-void TextDisplayer_LoL::play(int dim, char *str, EMCState *script, int16 *paramList, int16 paramIndex) {
+void TextDisplayer_LoL::playDialogue(int dim, char *str, EMCState *script, int16 *paramList, int16 paramIndex) {
 	memcpy(_curPara, _stringParameters, 15 * sizeof(char*));
 	//char *cmds = _curPara[0];
+	_colour1prot = false;
 
 	if (dim == 3) {
 		if (_vm->_updateFlags & 2) {
 			_screen->clearDim(4);
 			dim = _screen->curDimIndex();
 			_colour1 = 254;
+			_colour1prot = true;
 		} else {
 			_screen->clearDim(3);
 			dim = _screen->curDimIndex();
 			_colour1 = 192;
-			uint8 col[3];
-			_screen->loadColour254(col);
-			_screen->setPaletteIndex(192, col[0], col[1], col[2]);
+			_colour1prot = true;
+			_screen->copyColour(192, 254);
 			//toggleGuiUnk(11, 1);
-			_vm->_updateCharV4 = 0;
-			_vm->_restorePalette = 0;
+			_vm->_textColourFlag = 0;
+			_vm->_fadeText = false;
 		}
 
 	} else {
 		_screen->setScreenDim(dim);
 		_colour1 = 254;
+		_colour1prot = true;
 	}
 
 	int cp = _screen->setCurPage(0);
@@ -188,9 +190,52 @@
 	_screen->setCurPage(cp);
 	_screen->setFont(of);
 
-	_vm->_restorePalette = 0;
+	_vm->_fadeText = false;
 }
 
+void TextDisplayer_LoL::printMessage(uint16 flags, char *str, ...) {
+	static uint8 textColours[] = { 0xfe, 0xa2, 0x84, 0x97, 0x9F };
+	static uint8 soundEffect[] = { 0x0B, 0x00, 0x2B, 0x1B, 0x00 };
+	if (flags & 4)
+		flags ^= 4;
+	else
+		_vm->updatePortraits();
+
+	uint16 col = textColours[flags & 0x7fff];
+
+	int od = _screen->curDimIndex();
+
+	if (_vm->_updateFlags & 2) {
+		_screen->setScreenDim(4);
+		_screen->clearCurDim();		
+	} else {
+		_screen->setScreenDim(3);
+		_screen->clearCurDim();
+		_screen->copyColour(192, col);
+		//toggleGuiUnk(11, 1);
+	}
+
+	_colour1 = 192;
+	_colour1prot = true;
+
+	va_list args;
+	va_start(args, str);
+
+	vsnprintf((char*) _buffer, 240, str, args);
+
+	va_end(args);
+	
+	displayText(str);
+
+	_screen->setScreenDim(od);
+
+	if (!(flags & 0x8000) && soundEffect[flags])
+		_vm->sound()->playSoundEffect(soundEffect[flags]);
+
+	_vm->_textColourFlag = flags & 0x7fff;
+	_vm->_fadeText = false;
+}
+
 bool TextDisplayer_LoL::preprocessString(char *str, EMCState *script, int16 *paramList, int16 paramIndex) {
 	int cnt = 0;
 	bool res = false;
@@ -322,7 +367,8 @@
 
 	memset(_ctrl, 0, 3);
 
-	_colour1 = _screen->_curDim->unk8;
+	if (!_colour1prot)
+		_colour1 = _screen->_curDim->unk8;
 	_colour2 = _screen->_curDim->unkA;
 	_posX = _screen->_curDim->unkC;
 	_posY = _screen->_curDim->unkE;

Modified: scummvm/trunk/engines/kyra/text_lol.h
===================================================================
--- scummvm/trunk/engines/kyra/text_lol.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/engines/kyra/text_lol.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -44,7 +44,8 @@
 	void setupField(bool mode);
 	void expandField();
 
-	void play(int dim, char *str, EMCState *script, int16 *paramList, int16 paramIndex);
+	void playDialogue(int dim, char *str, EMCState *script, int16 *paramList, int16 paramIndex);
+	void printMessage(uint16 colSnd, char *str, ...);
 	
 	int16 _scriptParameter;
 
@@ -90,6 +91,7 @@
 	uint8 _posY;
 	uint8 _colour1;
 	uint8 _colour2;
+	bool _colour1prot;
 
 	uint8 *_pageBuffer1;
 	uint8 *_pageBuffer2;

Modified: scummvm/trunk/tools/create_kyradat/create_kyradat.cpp
===================================================================
--- scummvm/trunk/tools/create_kyradat/create_kyradat.cpp	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/tools/create_kyradat/create_kyradat.cpp	2009-02-14 00:51:07 UTC (rev 36320)
@@ -31,7 +31,7 @@
 #include "md5.h"
 
 enum {
-	kKyraDatVersion = 35,
+	kKyraDatVersion = 36,
 	kIndexSize = 12
 };
 
@@ -74,6 +74,7 @@
 bool extractRaw16to8(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch = 0);
 bool extractMrShapeAnimData(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch = 0);
 bool extractRaw16(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch = 0);
+bool extractLolButtonDefs(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch = 0);
 
 int extractHofSeqData_checkString(const void *ptr, uint8 checkSize);
 int extractHofSeqData_isSequence(const void *ptr, const Game *g, uint32 maxCheckSize);
@@ -99,6 +100,7 @@
 	{ k3TypeShpData, extractMrShapeAnimData, createFilename },
 
 	{ lolTypeRaw16, extractRaw16, createFilename },
+	{ lolTypeButtonDef, extractLolButtonDefs, createFilename },
 
 	{ -1, 0, 0}
 };
@@ -269,6 +271,7 @@
 	{ lolMusicTrackMap, kTypeRawData, "MUSIC.MAP" },
 	{ lolGMSfxIndex, kTypeRawData, "SFX_GM.MAP" },
 	{ lolMT32SfxIndex, kTypeRawData, "SFX_MT32.MAP" },
+	//{ lolADLSfxIndex, kTypeRawData, "SFX_ADL.MAP" },
 	{ lolSpellProperties, kTypeRawData, "SPELLS.DEF" },
 	{ lolGameShapeMap, kTypeRawData, "GAMESHP.MAP" },
 	{ lolLevelShpList, kTypeStringList, "SHPFILES.TXT" },
@@ -297,6 +300,21 @@
 	{ lolDscDoorX, lolTypeRaw16, "DSCDOORX.DEF" },
 	{ lolDscDoorY, lolTypeRaw16, "DSCDOORY.DEF" },
 
+	{ lolScrollXTop, k3TypeRaw16to8, "SCROLLXT.DEF" },
+	{ lolScrollYTop, k3TypeRaw16to8, "SCROLLYT.DEF" },
+	{ lolScrollXBottom, k3TypeRaw16to8, "SCROLLXB.DEF" },
+	{ lolScrollYBottom, k3TypeRaw16to8, "SCROLLYB.DEF" },
+
+	{ lolButtonDefs, lolTypeButtonDef, "BUTTONS.DEF" },
+	{ lolButtonList1, lolTypeRaw16, "BUTTON1.LST" },
+	{ lolButtonList2, lolTypeRaw16, "BUTTON2.LST" },
+	{ lolButtonList3, lolTypeRaw16, "BUTTON3.LST" },
+	{ lolButtonList4, lolTypeRaw16, "BUTTON4.LST" },
+	{ lolButtonList5, lolTypeRaw16, "BUTTON5.LST" },
+	{ lolButtonList6, lolTypeRaw16, "BUTTON6.LST" },
+	{ lolButtonList7, lolTypeRaw16, "BUTTON7.LST" },
+	{ lolButtonList8, lolTypeRaw16, "BUTTON84.LST" },
+
 	{ -1, 0, 0 }
 };
 
@@ -1065,6 +1083,37 @@
 	return out.addFile(filename, buffer, size);
 }
 
+bool extractLolButtonDefs(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch) {
+	int num = size / 22;
+	uint32 outsize = num * 18;
+	uint8 *buffer = new uint8[size];
+	const uint8 *src = data;
+	uint8 *dst = buffer;
+
+	for (int i = 0; i < num; i++) {
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		*dst++ = *src++;
+		*dst++ = *src++;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 6; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+		WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
+		src += 2; dst += 2;
+	}
+
+	return out.addFile(filename, buffer, size);
+}
+
 bool extractMrShapeAnimData(PAKFile &out, const Game *g, const byte *data, const uint32 size, const char *filename, int fmtPatch) {
 	int outsize = 1;
 	uint8 *buffer = new uint8[size + 1];

Modified: scummvm/trunk/tools/create_kyradat/create_kyradat.h
===================================================================
--- scummvm/trunk/tools/create_kyradat/create_kyradat.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/tools/create_kyradat/create_kyradat.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -182,6 +182,7 @@
 	lolMusicTrackMap,
 	lolGMSfxIndex,
 	lolMT32SfxIndex,
+	//lolADLSfxIndex,
 	lolSpellProperties,
 	lolGameShapeMap,
 	lolLevelShpList,
@@ -210,6 +211,21 @@
 	lolDscDoorX,
 	lolDscDoorY,
 
+	lolScrollXTop,
+	lolScrollYTop,
+	lolScrollXBottom,
+	lolScrollYBottom,
+
+	lolButtonDefs,
+	lolButtonList1,
+	lolButtonList2,
+	lolButtonList3,
+	lolButtonList4,
+	lolButtonList5,
+	lolButtonList6,
+	lolButtonList7,
+	lolButtonList8,
+
 	kMaxResIDs
 };
 
@@ -305,7 +321,8 @@
 	k3TypeRaw16to8,
 	k3TypeShpData,
 
-	lolTypeRaw16
+	lolTypeRaw16,
+	lolTypeButtonDef
 };
 
 struct ExtractType {

Modified: scummvm/trunk/tools/create_kyradat/lol_cd.h
===================================================================
--- scummvm/trunk/tools/create_kyradat/lol_cd.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/tools/create_kyradat/lol_cd.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -5,6 +5,7 @@
 	{ lolMusicTrackMap, 0x0002A240, 0x0002A330 },	
 	{ lolGMSfxIndex, 0x0002B010, 0x0002B10A },
 	{ lolMT32SfxIndex, 0x0002B110, 0x0002B20A },
+	//{ lolADLSfxIndex, 0x0002B210, 0x0002B30A },
 	{ lolSpellProperties, 0x0002B5D0, 0x0002B6E8 },
 	{ lolGameShapeMap, 0x0002B35D, 0x0002B52C },
 	{ lolLevelShpList, 0x00032826, 0x000328A5 },
@@ -31,8 +32,23 @@
 	{ lolDscBlockIndex, 0x00033B53, 0x00033B9B },
 	{ lolDscDoor1, 0x0002B550, 0x0002B5D0 },
 	{ lolDscDoorX, 0x00027CC0, 0x00028140 },
-	{ lolDscDoorY, 0x00028140, 0x000285C0 },	
+	{ lolDscDoorY, 0x00028140, 0x000285C0 },
 
+	{ lolScrollXTop, 0x00033D40, 0x00033D4A },
+	{ lolScrollYTop, 0x00033D4A, 0x00033D54 },
+	{ lolScrollXBottom, 0x00033D54, 0x00033D5E },
+	{ lolScrollYBottom, 0x00033D5E, 0x00033D68 },
+
+	{ lolButtonDefs, 0x00028E80, 0x000296AA },
+	{ lolButtonList1, 0x000296B0, 0x00029700 },
+	{ lolButtonList2, 0x00029700, 0x0002971E },
+	{ lolButtonList3, 0x00029720, 0x00029724 },
+	{ lolButtonList4, 0x00029730, 0x0002974E },
+	{ lolButtonList5, 0x00029750, 0x00029770 },
+	{ lolButtonList6, 0x00029770, 0x0002978C },
+	{ lolButtonList7, 0x00029790, 0x00029796 },
+	{ lolButtonList8, 0x000297A0, 0x000297A4 },
+
 	{ -1, 0, 0 }
 };
 

Modified: scummvm/trunk/tools/create_kyradat/misc.h
===================================================================
--- scummvm/trunk/tools/create_kyradat/misc.h	2009-02-14 00:44:52 UTC (rev 36319)
+++ scummvm/trunk/tools/create_kyradat/misc.h	2009-02-14 00:51:07 UTC (rev 36320)
@@ -488,6 +488,7 @@
 	lolMusicTrackMap,
 	lolGMSfxIndex,
 	lolMT32SfxIndex,
+	//lolADLSfxIndex,
 	lolSpellProperties,
 	lolGameShapeMap,
 	lolLevelShpList,
@@ -515,6 +516,22 @@
 	lolDscDoorX,
 	lolDscDoorY,
 
+	lolScrollXTop,
+	lolScrollYTop,
+	lolScrollXBottom,
+	lolScrollYBottom,
+
+	lolButtonDefs,
+	lolButtonList1,
+	lolButtonList1,
+	lolButtonList2,
+	lolButtonList3,
+	lolButtonList4,
+	lolButtonList5,
+	lolButtonList6,
+	lolButtonList7,
+	lolButtonList8,
+
 	-1
 };
 


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