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

athrxx at users.sourceforge.net athrxx at users.sourceforge.net
Tue Mar 24 08:18:16 CET 2009


Revision: 39653
          http://scummvm.svn.sourceforge.net/scummvm/?rev=39653&view=rev
Author:   athrxx
Date:     2009-03-24 07:18:16 +0000 (Tue, 24 Mar 2009)

Log Message:
-----------
LOL: - implemented lots of opcodes and fixed a few bugs
- it's now possible to leave the castle

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui_lol.cpp
    scummvm/trunk/engines/kyra/items_lol.cpp
    scummvm/trunk/engines/kyra/lol.cpp
    scummvm/trunk/engines/kyra/lol.h
    scummvm/trunk/engines/kyra/scene_lol.cpp
    scummvm/trunk/engines/kyra/script_lol.cpp
    scummvm/trunk/engines/kyra/script_tim.cpp
    scummvm/trunk/engines/kyra/sprites_lol.cpp
    scummvm/trunk/engines/kyra/staticres.cpp
    scummvm/trunk/engines/kyra/text_lol.cpp
    scummvm/trunk/engines/kyra/timer_lol.cpp

Modified: scummvm/trunk/engines/kyra/gui_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/gui_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -74,7 +74,7 @@
 }
 
 void LoLEngine::gui_drawInventory() {
-	if (!_hideControls || !_hideInventory) {
+	if (!_currentControlMode || !_hideInventory) {
 		for (int i = 0; i < 9; i++)
 			gui_drawInventoryItem(i);
 	}
@@ -342,7 +342,7 @@
 	int cp = _screen->setCurPage(6);
 
 	gui_drawBox(0, 0, 66, 34, 1, 1, -1);
-	gui_drawCharFaceShape(0, 0, 1, _screen->_curPage);
+	gui_drawCharFaceShape(charNum, 0, 1, _screen->_curPage);
 
 	gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 162, 1, 0);
 	gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 154, 1, 1);
@@ -427,11 +427,11 @@
 }
 
 void LoLEngine::gui_drawCharFaceShape(int charNum, int x, int y, int pageNum) {
-	if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].nextFaceFrame)
-		_characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame;
+	if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].defaultFaceFrame)
+		_characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame;
 
-	if (_characters[charNum].nextFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7)
-		_characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame;
+	if (_characters[charNum].defaultFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7)
+		_characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame;
 
 	int frm = (_characters[charNum].flags & 0x1108 && _characters[charNum].curFaceFrame < 7) ? 1 : _characters[charNum].curFaceFrame;
 
@@ -573,7 +573,7 @@
 int LoLEngine::gui_enableControls() {
 	_floatingMouseArrowControl = 0;
 
-	if (!_hideControls) {
+	if (!_currentControlMode) {
 		for (int i = 76; i < 85; i++)
 			gui_toggleButtonDisplayMode(i, 2);
 	}
@@ -583,7 +583,7 @@
 }
 
 int LoLEngine::gui_disableControls(int controlMode) {
-	if (_hideControls)
+	if (_currentControlMode)
 		return 0;
 
 	_floatingMouseArrowControl = (controlMode & 2) ? 2 : 1;
@@ -603,7 +603,7 @@
 	if (shapeIndex == 78 && !(_gameFlags[15] & 0x1000))
 		return;
 
-	if (_hideControls && _hideInventory)
+	if (_currentControlMode && _hideInventory)
 		return;
 
 	if (mode == 0)
@@ -807,11 +807,11 @@
 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);
+	gui_setFaceFramesControlButtons(7, 44);
+	gui_setFaceFramesControlButtons(11, 44);
+	gui_setFaceFramesControlButtons(17, 0);
+	gui_setFaceFramesControlButtons(29, 0);
+	gui_setFaceFramesControlButtons(25, 33);
 
 	if (_gameFlags[15] & 0x2000)
 		gui_initMagicScrollButtons();
@@ -834,11 +834,19 @@
 		gui_initButtonsFromList(_buttonList5);
 }
 
+void LoLEngine::gui_specialSceneRestoreButtons() {
+	if (!_spsWindowW && !_spsWindowH)
+		return;
+
+	gui_enableDefaultPlayfieldButtons();
+	_spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = _seqTrigger = 0;
+}
+
 void LoLEngine::gui_enableCharInventoryButtons(int charNum) {
 	gui_resetButtonList();
 	gui_initButtonsFromList(_buttonList2);
 	gui_initCharInventorySpecialButtons(charNum);
-	gui_initCharacterControlButtons(21, 0);
+	gui_setFaceFramesControlButtons(21, 0);
 }
 
 void LoLEngine::gui_resetButtonList() {
@@ -857,7 +865,7 @@
 		gui_initButton(*list++);
 }
 
-void LoLEngine::gui_initCharacterControlButtons(int index, int xOffs) {
+void LoLEngine::gui_setFaceFramesControlButtons(int index, int xOffs) {
 	int c = countActiveCharacters();
 	for (int i = 0; i < c; i++)
 		gui_initButton(index + i, _activeCharsXpos[i] + xOffs);
@@ -1061,7 +1069,7 @@
 		// TODO
 		///
 		/*if (processSpellcast(c, _availableSpells[_selectedSpell], spellLevel)) {
-			initCharacterUnkSub(c, 1, 8, 1);
+			setFaceFramesUnkArrays(c, 1, 8, 1);
 			sub_718F(c, 2, spellLevel * spellLevel);
 		} else {*/
 			_characters[c].flags &= 0xfffb;
@@ -1252,7 +1260,7 @@
 	int found = checkSceneForItems(&_levelBlockProperties[block].drawObjects, p & 0x7f);
 
 	if (found != -1) {
-		pickupItem(found, block);
+		removeLevelItem(found, block);
 		setHandItem(found);
 	}
 
@@ -1348,7 +1356,7 @@
 			break;
 
 		case 2:
-			res = clicked2(block, dir);
+			res = clickedLever(block, dir);
 			break;
 
 		case 3:

Modified: scummvm/trunk/engines/kyra/items_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/items_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/items_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -110,7 +110,7 @@
 	}
 }
 
-int LoLEngine::makeItem(int itemIndex, int curFrame, int flags) {
+int LoLEngine::makeItem(int itemType, int curFrame, int flags) {
 	int cnt = 0;
 	int r = 0;
 	int i = 1;
@@ -171,13 +171,29 @@
 
 	memset(&_itemsInPlay[slot], 0, sizeof(ItemInPlay));
 
-	_itemsInPlay[slot].itemPropertyIndex = itemIndex;
+	_itemsInPlay[slot].itemPropertyIndex = itemType;
 	_itemsInPlay[slot].shpCurFrame_flg = (curFrame & 0x1fff) | flags;
 	_itemsInPlay[slot].level = -1;
 
 	return slot;
 }
 
+void LoLEngine::placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight) {
+	calcCoordinates(_itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, block, xOffs, yOffs);
+
+	if (_itemsInPlay[itemIndex].blockPropertyIndex)
+		removeLevelItem(itemIndex, _itemsInPlay[itemIndex].blockPropertyIndex);
+
+	if (_currentLevel == level) {
+		setItemPosition(itemIndex, _itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, flyingHeight, 1);
+	} else {
+		_itemsInPlay[itemIndex].level = level;
+		_itemsInPlay[itemIndex].blockPropertyIndex = block;
+		_itemsInPlay[itemIndex].flyingHeight = flyingHeight;
+		_itemsInPlay[itemIndex].shpCurFrame_flg |= 0x4000;
+	}
+}
+
 bool LoLEngine::addItemToInventory(int itemIndex) {
 	int pos = 0;
 	int i = 0;
@@ -265,7 +281,7 @@
 
 	if (itemIndex && !(_gameFlags[15] & 0x200)) {
 		mouseOffs = 10;
-		if (!_hideControls || textEnabled())
+		if (!_currentControlMode || textEnabled())
 			_txt->printMessage(0, getLangString(0x403E), getLangString(_itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].nameStringId));
 	}
 
@@ -300,7 +316,7 @@
 	checkSceneUpdateNeed(block);
 }
 
-void LoLEngine::pickupItem(int item, int block) {
+void LoLEngine::removeLevelItem(int item, int block) {
 	removeAssignedObjectFromBlock(&_levelBlockProperties[block], item);
 	removeDrawObjectFromBlock(&_levelBlockProperties[block], item);
 	runLevelScriptCustom(block, 0x100, -1, item, 0, 0);
@@ -310,7 +326,7 @@
 
 bool LoLEngine::throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c) {
 	int sp = checkDrawObjectSpace(_partyPosX, _partyPosX, x, y);
-	FlyingObject *t = _flyingItems;
+	FlyingObject *t = _flyingObjects;
 	int slot = -1;
 	int i = 0;
 
@@ -331,7 +347,7 @@
 	if (sp != -1 && slot != -1) {
 		i = slot;
 
-		t = &_flyingItems[i];
+		t = &_flyingObjects[i];
 		endObjectFlight(t, x, y, 8);
 	}
 

Modified: scummvm/trunk/engines/kyra/lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -86,7 +86,8 @@
 	_itemInHand = 0;
 	memset(_inventory, 0, sizeof(_inventory));
 	_inventoryCurItem = 0;
-	_hideControls = 0;
+	_currentControlMode = 0;
+	_specialSceneFlag = 0;
 	_lastCharInventory = -1;
 
 	_itemIconShapes = _itemShapes = _gameShapes = _thrownShapes = _effectShapes = _fireballShapes = 0;
@@ -119,7 +120,7 @@
 	_scriptDirection = 0;
 	_currentDirection = 0;
 	_currentBlock = 0;
-	memset(_currentBlockPropertyIndex, 0, sizeof(_currentBlockPropertyIndex));
+	memset(_visibleBlockIndex, 0, sizeof(_visibleBlockIndex));
 
 	_scrollSceneBuffer = 0;
 	_smoothScrollModeNormal = 1;
@@ -147,12 +148,13 @@
 	_lampOilStatus = _brightness = _lampStatusUnk = 0;
 	_lampStatusSuspended = false;
 	_tempBuffer5120 = 0;
-	_flyingItems = 0;
+	_flyingObjects = 0;
 	_monsters = 0;
 	_lastMouseRegion = 0;
 	_monsterLastWalkDirection = _monsterCountUnk = _monsterShiftAlt = 0;
 	_monsterCurBlock = 0;
 	_seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0;
+	_spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = 0;
 
 	_dscUnk1 = 0;
 	_dscShapeIndex = 0;
@@ -181,7 +183,7 @@
 	_curMusicFileIndex = -1;
 	_environmentSfx = _environmentSfxVol = _environmentSfxDistThreshold = 0;
 
-	_sceneDrawVar1 = _sceneDrawVar2 = _sceneDrawVar3 = _wllProcessFlag = 0;
+	_sceneDrawVarDown = _sceneDrawVarRight = _sceneDrawVarLeft = _wllProcessFlag = 0;
 	_partyPosX = _partyPosY = 0;
 	_shpDmX = _shpDmY = _dmScaleW = _dmScaleH = 0;
 
@@ -209,6 +211,8 @@
 	_monsterDifficulty = 1;
 	_smoothScrollingEnabled = true;
 	_floatingCursorsEnabled = false;
+
+	_unkIceSHpFlag = 0;
 }
 
 LoLEngine::~LoLEngine() {
@@ -299,7 +303,7 @@
 	delete[] _lvlShapeBottom;
 	delete[] _lvlShapeLeftRight;
 	delete[] _tempBuffer5120;
-	delete[] _flyingItems;
+	delete[] _flyingObjects;
 	delete[] _monsters;
 	delete[] _levelBlockProperties;
 	delete[] _monsterProperties;
@@ -418,8 +422,8 @@
 	_tempBuffer5120 = new uint8[5120];
 	memset(_tempBuffer5120, 0, 5120);
 
-	_flyingItems = new FlyingObject[8];
-	memset(_flyingItems, 0, 8 * sizeof(FlyingObject));
+	_flyingObjects = new FlyingObject[8];
+	memset(_flyingObjects, 0, 8 * sizeof(FlyingObject));
 
 	memset(_gameFlags, 0, sizeof(_gameFlags));
 	memset(_globalScriptVars, 0, sizeof(_globalScriptVars));
@@ -757,7 +761,7 @@
 
 	gui_enableDefaultPlayfieldButtons();
 
-	loadLevel(1);
+	loadLevel(_currentLevel);
 
 	_screen->showMouse();
 }
@@ -885,29 +889,29 @@
 
 	calcCharPortraitXpos();
 	if (numChars > 0)
-		initCharacter(numChars, 2, 6, 0);
+		setFaceFrames(numChars, 2, 6, 0);
 
 	return true;
 }
 
-void LoLEngine::initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw) {
-	_characters[charNum].nextFaceFrame = firstFaceFrame;
-	if (firstFaceFrame || unk2)
-		initCharacterUnkSub(charNum, 6, unk2, 1);
+void LoLEngine::setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw) {
+	_characters[charNum].defaultFaceFrame = defaultFrame;
+	if (defaultFrame || unk2)
+		setFaceFramesUnkArrays(charNum, 6, unk2, 1);
 	if (redraw)
 		gui_drawCharPortraitWithStats(charNum);
 }
 
-void LoLEngine::initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3) {
+void LoLEngine::setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3) {
+	LoLCharacter *l = &_characters[charNum];
 	for (int i = 0; i < 5; i++) {
-		if (_characters[charNum].arrayUnk1[i] == 0 || (unk3 && _characters[charNum].arrayUnk1[i] == unk1)) {
-			_characters[charNum].arrayUnk1[i] = unk1;
-			_characters[charNum].arrayUnk2[i] = unk2;
+		if (l->arrayUnk2[i] && (!unk3 || l->arrayUnk2[i] != unk1))
+			continue;
 
-			// TODO
-
-			break;
-		}
+		l->arrayUnk2[i] = unk1;
+		l->arrayUnk1[i] = unk2;
+		_timer->setNextRun(3, _system->getMillis());
+		_timer->enable(3);		
 	}
 }
 
@@ -1029,10 +1033,10 @@
 
 void LoLEngine::faceFrameRefresh(int charNum) {
 	if (_characters[charNum].curFaceFrame == 1)
-		initCharacter(charNum, 0, 0, 0);
+		setFaceFrames(charNum, 0, 0, 0);
 	else if (_characters[charNum].curFaceFrame == 6)
-		if (_characters[charNum].nextFaceFrame != 5)
-			initCharacter(charNum, 0, 0, 0);
+		if (_characters[charNum].defaultFaceFrame != 5)
+			setFaceFrames(charNum, 0, 0, 0);
 		else
 			_characters[charNum].curFaceFrame = 5;
 	else
@@ -1156,8 +1160,8 @@
 	}
 }
 
-void LoLEngine::initAnimatedDialogue(int controlMode) {
-	resetPortraitsArea();
+void LoLEngine::initSceneWindowDialogue(int controlMode) {
+	resetPortraitsAndDisableSysTimer();
 	gui_prepareForSequence(112, 0, 176, 120, controlMode);
 
 	_updateFlags |= 3;
@@ -1182,7 +1186,7 @@
 }
 
 void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags) {
-	setSequenceGui(x, y, w, h, buttonFlags);
+	setSequenceButtons(x, y, w, h, buttonFlags);
 
 	_seqWindowX1 = x;
 	_seqWindowY1 = y;
@@ -1200,12 +1204,34 @@
 	}
 }
 
-void LoLEngine::restoreAfterAnimatedDialogue(int redraw) {
+void LoLEngine::gui_specialSceneSuspendControls(int controlMode) {
+	if (controlMode) {
+		_updateFlags |= 4;
+		setLampMode(false);
+	}
+	_updateFlags |= 1;
+	_specialSceneFlag = 1;
+	_currentControlMode = controlMode;
+	calcCharPortraitXpos();
+	//checkMouseRegions();
+}
+
+void LoLEngine::gui_specialSceneRestoreControls(int restoreLamp) {
+	if (restoreLamp) {
+		_updateFlags &= 0xfffa;
+		resetLampStatus();
+	}
+	_updateFlags &= 0xfffe;
+	_specialSceneFlag = 0;
+	//checkMouseRegions();
+}
+
+void LoLEngine::restoreAfterSceneWindowDialogue(int redraw) {
 	gui_enableControls();
 	_txt->setupField(false);
 	_updateFlags &= 0xffdf;
 
-	restoreDefaultGui();
+	setDefaultButtonState();
 
 	for (int i = 0; i < 6; i++)
 		_tim->freeAnimStruct(i);
@@ -1224,7 +1250,7 @@
 	enableSysTimer(2);
 }
 
-void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) {
+void LoLEngine::initDialogueSequence(int controlMode, int pageNum) {
 	if (controlMode) {
 		_timer->disable(11);
 		_fadeText = false;
@@ -1239,7 +1265,7 @@
 		_txt->clearDim(4);
 
 		_updateFlags |= 2;
-		_hideControls = controlMode;
+		_currentControlMode = controlMode;
 		calcCharPortraitXpos();
 
 		if (!textEnabled() && (!(controlMode & 2))) {
@@ -1261,19 +1287,19 @@
 		_txt->clearDim(4);
 	}
 	
-	_hideControls = controlMode;
+	_currentControlMode = controlMode;
 	_dialogueField = true;	
 }
 
-void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) {
+void LoLEngine::restoreAfterDialogueSequence(int controlMode) {
 	if (!_dialogueField)
 		return;
 
 	updatePortraits();
-	_hideControls = controlMode;
+	_currentControlMode = controlMode;
 	calcCharPortraitXpos();
 
-	if (_hideControls) {
+	if (_currentControlMode) {
 		_screen->modifyScreenDim(4, 11, 124, 28, 45);
 		_screen->modifyScreenDim(5, 85, 123, 233, 54);
 		_updateFlags &= 0xfffd;
@@ -1287,9 +1313,9 @@
 	_dialogueField = false;
 }
 
-void LoLEngine::resetPortraitsArea() {
+void LoLEngine::resetPortraitsAndDisableSysTimer() {
 	_hideInventory = 1;
-	if (!textEnabled() || (!(_hideControls & 2)))
+	if (!textEnabled() || (!(_currentControlMode & 2)))
 		timerUpdatePortraitAnimations(1);
 
 	disableSysTimer(2);
@@ -1613,16 +1639,16 @@
 	if (charId == 1) {
 		charId = _selectedCharacter;
 	} else {
-		if (charId < 0) {
-			for (int i = 0; i < 4; i++) {
-				if (charId != _characters[i].id || !(_characters[i].flags & 1))
-					continue;
-				charId = i;
-				break;
-			}
-		} else {
-			charId = 0;
+		int i = 0;
+		for (;i < 4; i++) {
+			if (charId != _characters[i].id || !(_characters[i].flags & 1))
+				continue;
+			charId = i;
+			break;
 		}
+
+		if (i == 4)
+			return false;
 	}
 
 	bool r = snd_playCharacterSpeech(track, charId, 0);
@@ -1683,7 +1709,7 @@
 	if (script)
 		snd_playCharacterSpeech(script->stack[script->sp + 2], ch, 0);
 	else if (paramList)
-		snd_playCharacterSpeech(paramList[1], ch, 0);
+		snd_playCharacterSpeech(paramList[2], ch, 0);
 
 	if (textEnabled()) {
 		if (mode == 0) {

Modified: scummvm/trunk/engines/kyra/lol.h
===================================================================
--- scummvm/trunk/engines/kyra/lol.h	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/lol.h	2009-03-24 07:18:16 UTC (rev 39653)
@@ -49,7 +49,7 @@
 	uint8 raceClassSex;
 	int16 id;
 	uint8 curFaceFrame;
-	uint8 nextFaceFrame;
+	uint8 defaultFaceFrame;
 	uint8 field_12;
 	const uint16 *defaultModifiers;
 	uint16 itemsMight[8];
@@ -180,8 +180,8 @@
 struct LevelShapeProperty {
 	uint16 shapeIndex[10];
 	uint8 scaleFlag[10];
-	uint16 shapeX[10];
-	uint16 shapeY[10];
+	int16 shapeX[10];
+	int16 shapeY[10];
 	int8 next;
 	uint8 flags;
 };
@@ -420,6 +420,8 @@
 	void gui_toggleButtonDisplayMode(int shapeIndex, int mode);
 	void gui_toggleFightButtons(bool disable);
 	void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags);
+	void gui_specialSceneSuspendControls(int controlMode);
+	void gui_specialSceneRestoreControls(int restoreLamp);
 
 	bool _weaponsDisabled;
 	int _lastButtonShape;
@@ -437,11 +439,12 @@
 	void gui_triggerEvent(int eventType);
 	void gui_enableDefaultPlayfieldButtons();
 	void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags);
+	void gui_specialSceneRestoreButtons();
 	void gui_enableCharInventoryButtons(int charNum);
 
 	void gui_resetButtonList();
 	void gui_initButtonsFromList(const int16 *list);
-	void gui_initCharacterControlButtons(int index, int xOffs);
+	void gui_setFaceFramesControlButtons(int index, int xOffs);
 	void gui_initCharInventorySpecialButtons(int charNum);
 	void gui_initMagicScrollButtons();
 	void gui_initMagicSubmenu(int charNum);
@@ -524,7 +527,7 @@
 	uint16 _currentDirection;
 	uint16 _currentBlock;
 	bool _sceneUpdateRequired;
-	int16 _currentBlockPropertyIndex[18];
+	int16 _visibleBlockIndex[18];
 	uint16 _gameFlags[16];
 	uint16 _globalScriptVars[16];
 
@@ -542,6 +545,7 @@
 	int olol_allocItemPropertiesBuffer(EMCState *script);
 	int olol_setItemProperty(EMCState *script);
 	int olol_makeItem(EMCState *script);
+	int olol_createLevelItem(EMCState *script);
 	int olol_getItemPara(EMCState *script);
 	int olol_getCharacterStat(EMCState *script);
 	int olol_setCharacterStat(EMCState *script);
@@ -553,10 +557,13 @@
 	int olol_freeAnimStruct(EMCState *script);
 	int olol_getDirection(EMCState *script);
 	int olol_setMusicTrack(EMCState *script);
+	int olol_setSequenceButtons(EMCState *script);
+	int olol_setDefaultButtonState(EMCState *script);
 	int olol_checkRectForMousePointer(EMCState *script);
 	int olol_clearDialogueField(EMCState *script);
 	int olol_setupBackgroundAnimationPart(EMCState *script);
 	int olol_startBackgroundAnimation(EMCState *script);
+	int olol_fadeToBlack(EMCState *script);	
 	int olol_fadePalette(EMCState *script);
 	int olol_loadBitmap(EMCState *script);
 	int olol_stopBackgroundAnimation(EMCState *script);
@@ -572,6 +579,8 @@
 	int olol_initMonster(EMCState *script);
 	int olol_fadeClearSceneWindow(EMCState *script);
 	int olol_fadeSequencePalette(EMCState *script);
+	int olol_redrawPlayfield(EMCState *script);
+	int olol_loadNewLevel(EMCState *script);
 	int olol_dummy0(EMCState *script);
 	int olol_loadMonsterProperties(EMCState *script);
 	int olol_battleHitSkillTest(EMCState *script);
@@ -581,11 +590,12 @@
 	int olol_checkMoney(EMCState *script);
 	int olol_setScriptTimer(EMCState *script);
 	int olol_createHandItem(EMCState *script);
+	int olol_characterJoinsParty(EMCState *script);
 	int olol_loadTimScript(EMCState *script);
 	int olol_runTimScript(EMCState *script);
 	int olol_releaseTimScript(EMCState *script);
-	int olol_initAnimatedDialogue(EMCState *script);
-	int olol_restoreAfterAnimatedDialogue(EMCState *script);
+	int olol_initSceneWindowDialogue(EMCState *script);
+	int olol_restoreAfterSceneWindowDialogue(EMCState *script);
 	int olol_getItemInHand(EMCState *script);
 	int olol_giveItemToMonster(EMCState *script);
 	int olol_loadLangFile(EMCState *script);
@@ -593,6 +603,7 @@
 	int olol_processDialogue(EMCState *script);
 	int olol_stopTimScript(EMCState *script);
 	int olol_getWallFlags(EMCState *script);
+	int olol_changeMonsterSettings(EMCState *script);
 	int olol_playCharacterScriptChat(EMCState *script);
 	int olol_update(EMCState *script);
 	int olol_drawExitButton(EMCState *script);
@@ -604,17 +615,25 @@
 	int olol_playDialogueTalkText(EMCState *script);
 	int olol_checkMonsterTypeHostility(EMCState *script);
 	int olol_setNextFunc(EMCState *script);
+	int olol_dummy1(EMCState *script);
+	int olol_suspendMonster(EMCState *script);	
 	int olol_setDoorState(EMCState *script);
 	int olol_processButtonClick(EMCState *script);
 	int olol_savePage5(EMCState *script);
 	int olol_restorePage5(EMCState *script);
-	int olol_initNonAnimatedDialogue(EMCState *script);
-	int olol_restoreAfterNonAnimatedDialogue(EMCState *script);
+	int olol_initDialogueSequence(EMCState *script);
+	int olol_restoreAfterDialogueSequence(EMCState *script);
+	int olol_setSpecialSceneButtons(EMCState *script);
+	int olol_prepareSpecialScene(EMCState *script);
+	int olol_restoreAfterSpecialScene(EMCState *script);
 	int olol_assignCustomSfx(EMCState *script);
-	int olol_resetPortraitsArea(EMCState *script);
+	int olol_resetPortraitsAndDisableSysTimer(EMCState *script);
 	int olol_enableSysTimer(EMCState *script);
+	int olol_disableControls(EMCState *script);
+	int olol_enableControls(EMCState *script);	
 	int olol_queueSpeech(EMCState *script);
 	int olol_getItemPrice(EMCState *script);
+	int olol_getLanguage(EMCState *script);
 
 	// tim scripts
 	TIM *_activeTim[10];
@@ -629,8 +648,8 @@
 	int tlol_processWsaFrame(const TIM *tim, const uint16 *param);
 	int tlol_displayText(const TIM *tim, const uint16 *param);
 
-	int tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param);
-	int tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param);
+	int tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param);
+	int tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param);
 	int tlol_giveItem(const TIM *tim, const uint16 *param);
 	int tlol_setPartyPosition(const TIM *tim, const uint16 *param);
 	int tlol_fadeClearWindow(const TIM *tim, const uint16 *param);
@@ -663,11 +682,11 @@
 
 	// graphics
 	void setupScreenDims();
-	void initAnimatedDialogue(int controlMode);
-	void restoreAfterAnimatedDialogue(int redraw);
-	void initNonAnimatedDialogue(int controlMode, int pageNum);
-	void restoreAfterNonAnimatedDialogue(int controlMode);
-	void resetPortraitsArea();
+	void initSceneWindowDialogue(int controlMode);
+	void restoreAfterSceneWindowDialogue(int redraw);
+	void initDialogueSequence(int controlMode, int pageNum);
+	void restoreAfterDialogueSequence(int controlMode);
+	void resetPortraitsAndDisableSysTimer();
 	void toggleSelectedCharacterFrame(bool mode);
 	void fadeText();
 	void setPaletteBrightness(uint8 *palette, int brightness, int modifier);
@@ -699,8 +718,8 @@
 
 	// characters
 	bool addCharacter(int id);
-	void initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw);
-	void initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3);
+	void setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw);
+	void setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3);
 	int countActiveCharacters();
 	void loadCharFaceShapes(int charNum, int id);
 	void calcCharPortraitXpos();
@@ -774,20 +793,20 @@
 	void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile);
 
 	void resetItems(int flag);
-	void resetLvlBuffer();
+	void disableMonsters();
 	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);
+	void generateBlockDrawingBuffer();
+	void generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY);
+	void generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY);
 	bool hasWall(int index);
-	void assignBlockCaps(int block, int direction);
+	void assignVisibleBlocks(int block, int direction);
 
-	void drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum);
+	void drawVcnBlocks();
 	void drawSceneShapes();
 	void setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim);
 	void scaleLevelShapesDim(int index, int16 &y1, int16 &y2, int dim);
@@ -798,9 +817,13 @@
 	void setWallType(int block, int wall, int val);
 	void updateSceneWindow();
 
-	void setSequenceGui(int x, int y, int w, int h, int enableFlags);
-	void restoreDefaultGui();
+	void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag);
+	int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode);
 
+	void setSequenceButtons(int x, int y, int w, int h, int enableFlags);
+	void setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags);
+	void setDefaultButtonState();
+
 	void updateCompass();
 
 	void moveParty(uint16 direction, int unk1, int unk2, int buttonShape);
@@ -814,7 +837,7 @@
 	void calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction);
 
 	int clickedWallShape(uint16 block, uint16 direction);
-	int clicked2(uint16 block, uint16 direction);
+	int clickedLever(uint16 block, uint16 direction);
 	int clicked3(uint16 block, uint16 direction);
 	int clickedWallOnlyScript(uint16 block);
 	int clickedDoorSwitch(uint16 block, uint16 direction);
@@ -823,6 +846,7 @@
 	bool clickedShape(int shapeIndex);
 	void processDoorSwitch(uint16 block, int unk);
 	void openCloseDoor(uint16 block, int openClose);
+	void resetDoors();
 
 	void movePartySmoothScrollBlocked(int speed);
 	void movePartySmoothScrollUp(int speed);
@@ -874,9 +898,9 @@
 	int _lastSpecialColor;
 	int _lastSpecialColorWeight;
 
-	int _sceneDrawVar1;
-	int _sceneDrawVar2;
-	int _sceneDrawVar3;
+	int _sceneDrawVarDown;
+	int _sceneDrawVarRight;
+	int _sceneDrawVarLeft;
 	int _wllProcessFlag;
 
 	uint8 *_trueLightTable2;
@@ -895,7 +919,7 @@
 	int16 *_lvlShapeLeftRight;
 
 	LevelBlockProperty *_levelBlockProperties;
-	LevelBlockProperty *_curBlockCaps[18];
+	LevelBlockProperty *_visibleBlocks[18];
 
 	uint16 _partyPosX;
 	uint16 _partyPosY;
@@ -913,6 +937,7 @@
 
 	int _lastMouseRegion;
 	int _seqWindowX1, _seqWindowY1,	_seqWindowX2, _seqWindowY2, _seqTrigger;
+	int _spsWindowX, _spsWindowY,	_spsWindowW, _spsWindowH;
 	
 	uint8 *_tempBuffer5120;
 	
@@ -970,7 +995,8 @@
 	// items
 	void giveCredits(int credits, int redraw);
 	void takeCredits(int credits, int redraw);
-	int makeItem(int itemIndex, int curFrame, int flags);
+	int makeItem(int itemType, int curFrame, int flags);
+	void placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight);
 	bool addItemToInventory(int itemIndex);
 	bool testUnkItemFlags(int itemIndex);
 	void deleteItem(int itemIndex);
@@ -979,7 +1005,7 @@
 	void setHandItem(uint16 itemIndex);
 
 	void setItemPosition(int item, uint16 x, uint16 y, int flyingHeight, int b);
-	void pickupItem(int item, int block);
+	void removeLevelItem(int item, int block);
 	bool throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c);
 	void endObjectFlight(FlyingObject *t, int x, int y, int objectOnNextBlock);
 	void processObjectFlight(FlyingObject *t, int x, int y);
@@ -1000,10 +1026,11 @@
 	int _itemInHand;
 	uint16 _inventory[48];
 	int _inventoryCurItem;
-	int _hideControls;
+	int _currentControlMode;
+	int _specialSceneFlag;
 	int _lastCharInventory;
 
-	FlyingObject *_flyingItems;
+	FlyingObject *_flyingObjects;
 
 	EMCData _itemScript;
 
@@ -1121,6 +1148,7 @@
 	const SpellProperty *_spellProperties;
 	int _spellPropertiesSize;
 	int _subMenuIndex;
+	uint16 _unkIceSHpFlag;
 
 	// unneeded
 	void setWalkspeed(uint8) {}

Modified: scummvm/trunk/engines/kyra/scene_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/scene_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -51,7 +51,7 @@
 	_emc->unload(&_scriptData);
 
 	resetItems(1);
-	resetLvlBuffer();
+	disableMonsters();
 	resetBlockProperties();
 
 	releaseMonsterShapes(0);
@@ -63,7 +63,7 @@
 	_currentLevel = index;
 	_updateFlags = 0;
 
-	restoreDefaultGui();
+	setDefaultButtonState();
 
 	loadTalkFile(index);
 
@@ -335,9 +335,9 @@
 		for (int ii = 0; ii < 10; ii++)
 			l->scaleFlag[ii] = s->readByte();
 		for (int ii = 0; ii < 10; ii++)
-			l->shapeX[ii] = s->readUint16LE();
+			l->shapeX[ii] = s->readSint16LE();
 		for (int ii = 0; ii < 10; ii++)
-			l->shapeY[ii] = s->readUint16LE();
+			l->shapeY[ii] = s->readSint16LE();
 		l->next = s->readByte();
 		l->flags = s->readByte();
 	}
@@ -402,8 +402,20 @@
 	memset(_screen->_currentPalette + 384, 0xff, 384);
 	memcpy(_screen->_currentPalette + 384, tmpPal, 384);*/
 
-	//loadSwampIceCol();
+	if (_currentLevel == 11) {
+		uint8 *swampPal = _res->fileData("SWAMPICE.COL", 0);
+		memcpy(_screen->getPalette(2), swampPal, 384);
+		memcpy(_screen->getPalette(2) + 0x180, _screen->_currentPalette, 384);
+		delete[] swampPal;
 
+		if (_unkIceSHpFlag & 4) {
+			uint8 *pal0 = _screen->_currentPalette;
+			uint8 *pal2 = _screen->getPalette(2);
+			for (int i = 1; i < 768; i++)
+				SWAP(pal0[i], pal2[i]);
+		}		
+	}
+
 	memcpy(_vcnBlocks, v, vcnLen);
 	v += vcnLen;
 
@@ -469,14 +481,15 @@
 		ItemInPlay *it = &_itemsInPlay[id];
 		it->level = _currentLevel;
 		it->blockPropertyIndex = i;
-		r->nextAssignedObject = 0;
+		if (r)
+			r->nextAssignedObject = 0;
 	}
 
 	if (flag)
-		memset(_flyingItems, 0, 8 * sizeof(FlyingObject));
+		memset(_flyingObjects, 0, 8 * sizeof(FlyingObject));
 }
 
-void LoLEngine::resetLvlBuffer() {
+void LoLEngine::disableMonsters() {
 	memset(_monsters, 0, 30 * sizeof(MonsterInPlay));
 	for (int i = 0; i < 30; i++)
 		_monsters[i].mode = 0x10;
@@ -726,7 +739,7 @@
 	return 1;
 }
 
-int LoLEngine::clicked2(uint16 block, uint16 direction) {
+int LoLEngine::clickedLever(uint16 block, uint16 direction) {
 	return 1;
 }
 
@@ -856,6 +869,22 @@
 	}
 }
 
+void LoLEngine::resetDoors() {
+	for (int i = 0; i < 3; i++) {
+		if (!_openDoorState[i].block)
+			continue;
+
+		uint16 b = _openDoorState[i].block;
+		
+		do {
+			_levelBlockProperties[b].walls[_openDoorState[i].wall] += _openDoorState[i].state;
+			_levelBlockProperties[b].walls[_openDoorState[i].wall ^ 2] += _openDoorState[i].state;
+		} while	(!(_wllWallFlags[_levelBlockProperties[b].walls[_openDoorState[i].wall]] & 0x30));
+
+		_openDoorState[i].block = 0;
+	}
+}
+
 void LoLEngine::movePartySmoothScrollBlocked(int speed) {
 	if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _hideInventory))
 		return;
@@ -1152,8 +1181,8 @@
 		updateSceneWindow();
 	}
 
-	generateBlockDrawingBuffer(_currentBlock, _currentDirection);
-	drawVcnBlocks(_vcnBlocks, _blockDrawingBuffer, _vcnShift, _sceneDrawPage1);
+	generateBlockDrawingBuffer();
+	drawVcnBlocks();
 	drawSceneShapes();
 
 	if (!pageNum) {
@@ -1192,7 +1221,108 @@
 	_screen->showMouse();
 }
 
-void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) {
+void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag) {
+	resetPortraitsAndDisableSysTimer();
+	if (fieldType) {
+		if (suspendGui)
+			gui_specialSceneSuspendControls(1);
+
+		if (!allowSceneUpdate)
+			_sceneDefaultUpdate = 0;
+
+		if (hasDialogue)
+			initDialogueSequence(fieldType, 0);
+
+		if (fadeFlag) {
+			_screen->fadePalette(_screen->getPalette(3), 10);
+			_screen->_fadeFlag = 0;
+		}
+		
+		setSpecialSceneButtons(0, 0, 320, 130, controlMode);
+
+	} else {
+		if (suspendGui)
+			gui_specialSceneSuspendControls(0);
+
+		if (!allowSceneUpdate)
+			_sceneDefaultUpdate = 0;
+
+		gui_disableControls(controlMode);
+
+		if (fadeFlag) {
+			memcpy(_screen->getPalette(3) + 384, _screen->_currentPalette + 384, 384);
+			_screen->loadSpecialColours(_screen->getPalette(3));
+			_screen->fadePalette(_screen->getPalette(3), 10);
+			_screen->_fadeFlag = 0;
+		}
+
+		if (hasDialogue)
+			initDialogueSequence(fieldType, 0);
+
+		setSpecialSceneButtons(112, 0, 176, 120, controlMode);
+	}
+}
+
+int LoLEngine::restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode) {
+	if (!_hideInventory)
+		return 0;
+
+	_hideInventory = 0;
+	enableSysTimer(2);
+
+	if (_dialogueField)
+		restoreAfterDialogueSequence(_currentControlMode);
+
+	if (_specialSceneFlag)
+		gui_specialSceneRestoreControls(_currentControlMode);
+
+	int l = _currentControlMode;
+	_currentControlMode = 0;
+
+	gui_specialSceneRestoreButtons();
+	calcCharPortraitXpos();
+
+	_currentControlMode = l;
+
+	if (releaseTimScripts) {
+		for (int i = 0; i < TIM::kWSASlots; i++)
+			_tim->freeAnimStruct(i);
+		
+		for (int i = 0; i < 10; i++)
+			_tim->unload(_activeTim[i]);
+	}
+
+	gui_enableControls();
+
+	if (fadeFlag) {
+		if ((_screen->_fadeFlag != 1 && _screen->_fadeFlag != 2) || (_screen->_fadeFlag == 1 && _currentControlMode)) {
+			if (_currentControlMode)
+				_screen->fadeToBlack(10);
+			else
+				_screen->fadeClearSceneWindow(10);
+		} 
+		
+		_currentControlMode = 0;
+		calcCharPortraitXpos();
+
+		if (redrawPlayField)
+			gui_drawPlayField();
+
+		setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
+
+	} else {
+		_currentControlMode = 0;
+		calcCharPortraitXpos();
+
+		if (redrawPlayField)			
+			gui_drawPlayField();
+	}
+
+	_sceneDefaultUpdate = sceneUpdateMode;
+	return 1;
+}
+
+void LoLEngine::setSequenceButtons(int x, int y, int w, int h, int enableFlags) {
 	gui_enableSequenceButtons(x, y, w, h, enableFlags);
 	_seqWindowX1 = x;
 	_seqWindowY1 = y;
@@ -1204,7 +1334,15 @@
 	_lampStatusSuspended = true;
 }
 
-void LoLEngine::restoreDefaultGui() {
+void LoLEngine::setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags) {
+	gui_enableSequenceButtons(x, y, w, h, enableFlags);
+	_spsWindowX = x;
+	_spsWindowY = y;
+	_spsWindowW = w;
+	_spsWindowH = h;
+}
+
+void LoLEngine::setDefaultButtonState() {
 	gui_enableDefaultPlayfieldButtons();
 	_seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0;
 	if (_lampStatusSuspended)
@@ -1212,140 +1350,157 @@
 	_lampStatusSuspended = false;
 }
 
-void LoLEngine::generateBlockDrawingBuffer(int block, int direction) {
-	_sceneDrawVar1 = _dscBlockMap[_currentDirection];
-	_sceneDrawVar2 = _dscBlockMap[_currentDirection + 4];
-	_sceneDrawVar3 = _dscBlockMap[_currentDirection + 8];
+void LoLEngine::generateBlockDrawingBuffer() {
+	_sceneDrawVarDown = _dscBlockMap[_currentDirection];
+	_sceneDrawVarRight = _dscBlockMap[_currentDirection + 4];
+	_sceneDrawVarLeft = _dscBlockMap[_currentDirection + 8];
 
+	/*******************************************
+    *             _visibleBlocks map           *
+	*                                          *
+	*     |     |     |     |     |     |      *
+	*  00 |  01 |  02 |  03 |  04 |  05 |  06  *
+	* ____|_____|_____|_____|_____|_____|_____ *
+	*     |     |     |     |     |     |      *
+	*     |  07 |  08 |  09 |  10 |  11 |      *
+	*     |_____|_____|_____|_____|_____|      *
+	*           |     |     |     |            *
+	*           |  12 |  13 |  14 |            *
+	*           |_____|_____|_____|            *
+	*                 |     |                  *
+	*              15 |  16 |  17              *
+	*                 | (P) |                  *
+	********************************************/
+
 	memset(_blockDrawingBuffer, 0, 660 * sizeof(uint16));
 
-	_wllProcessFlag = ((block >> 5) + (block & 0x1f) + _currentDirection) & 1;
+	_wllProcessFlag = ((_currentBlock >> 5) + (_currentBlock & 0x1f) + _currentDirection) & 1;
 
 	if (_wllProcessFlag) // floor and ceiling
-		generateBlockDrawingBufferF1(0, 15, 1, -330, 22, 15);
+		generateVmpTileDataFlipped(0, 15, 1, -330, 22, 15);
 	else
-		generateBlockDrawingBufferF0(0, 15, 1, -330, 22, 15);
+		generateVmpTileData(0, 15, 1, -330, 22, 15);
 
-	assignBlockCaps(block, direction);
+	assignVisibleBlocks(_currentBlock, _currentDirection);
 
-	uint8 t = _curBlockCaps[0]->walls[_sceneDrawVar2];
+	uint8 t = _visibleBlocks[0]->walls[_sceneDrawVarRight];
 	if (t)
-		generateBlockDrawingBufferF0(-2, 3, t, 102, 3, 5);
+		generateVmpTileData(-2, 3, t, 102, 3, 5);
 
-	t = _curBlockCaps[6]->walls[_sceneDrawVar3];
+	t = _visibleBlocks[6]->walls[_sceneDrawVarLeft];
 	if (t)
-		generateBlockDrawingBufferF1(21, 3, t, 102, 3, 5);
+		generateVmpTileDataFlipped(21, 3, t, 102, 3, 5);
 
-	t = _curBlockCaps[1]->walls[_sceneDrawVar2];
-	uint8 t2 = _curBlockCaps[2]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[1]->walls[_sceneDrawVarRight];
+	uint8 t2 = _visibleBlocks[2]->walls[_sceneDrawVarDown];
 
 	if (hasWall(t) && !(_wllWallFlags[t2] & 8))
-		generateBlockDrawingBufferF0(2, 3, t, 102, 3, 5);
+		generateVmpTileData(2, 3, t, 102, 3, 5);
 	else if (t && (_wllWallFlags[t2] & 8))
-		generateBlockDrawingBufferF0(2, 3, t2, 102, 3, 5);
+		generateVmpTileData(2, 3, t2, 102, 3, 5);
 
-	t = _curBlockCaps[5]->walls[_sceneDrawVar3];
-	t2 = _curBlockCaps[4]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[5]->walls[_sceneDrawVarLeft];
+	t2 = _visibleBlocks[4]->walls[_sceneDrawVarDown];
 
 	if (hasWall(t) && !(_wllWallFlags[t2] & 8))
-		generateBlockDrawingBufferF1(17, 3, t, 102, 3, 5);
+		generateVmpTileDataFlipped(17, 3, t, 102, 3, 5);
 	else if (t && (_wllWallFlags[t2] & 8))
-		generateBlockDrawingBufferF1(17, 3, t2, 102, 3, 5);
+		generateVmpTileDataFlipped(17, 3, t2, 102, 3, 5);
 
-	t = _curBlockCaps[2]->walls[_sceneDrawVar2];
+	t = _visibleBlocks[2]->walls[_sceneDrawVarRight];
 	if (t)
-		generateBlockDrawingBufferF0(8, 3, t, 97, 1, 5);
+		generateVmpTileData(8, 3, t, 97, 1, 5);
 
-	t = _curBlockCaps[4]->walls[_sceneDrawVar3];
+	t = _visibleBlocks[4]->walls[_sceneDrawVarLeft];
 	if (t)
-		generateBlockDrawingBufferF1(13, 3, t, 97, 1, 5);
+		generateVmpTileDataFlipped(13, 3, t, 97, 1, 5);
 
-	t = _curBlockCaps[1]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[1]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(-4, 3, t, 129, 6, 5);
+		generateVmpTileData(-4, 3, t, 129, 6, 5);
 
-	t = _curBlockCaps[5]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[5]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(20, 3, t, 129, 6, 5);
+		generateVmpTileData(20, 3, t, 129, 6, 5);
 
-	t = _curBlockCaps[2]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[2]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(2, 3, t, 129, 6, 5);
+		generateVmpTileData(2, 3, t, 129, 6, 5);
 
-	t = _curBlockCaps[4]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[4]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(14, 3, t, 129, 6, 5);
+		generateVmpTileData(14, 3, t, 129, 6, 5);
 
-	t = _curBlockCaps[3]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[3]->walls[_sceneDrawVarDown];
 	if (t)
-		generateBlockDrawingBufferF0(8, 3, t, 129, 6, 5);
+		generateVmpTileData(8, 3, t, 129, 6, 5);
 
-	t = _curBlockCaps[7]->walls[_sceneDrawVar2];
+	t = _visibleBlocks[7]->walls[_sceneDrawVarRight];
 	if (t)
-		generateBlockDrawingBufferF0(0, 3, t, 117, 2, 6);
+		generateVmpTileData(0, 3, t, 117, 2, 6);
 
-	t = _curBlockCaps[11]->walls[_sceneDrawVar3];
+	t = _visibleBlocks[11]->walls[_sceneDrawVarLeft];
 	if (t)
-		generateBlockDrawingBufferF1(20, 3, t, 117, 2, 6);
+		generateVmpTileDataFlipped(20, 3, t, 117, 2, 6);
 
-	t = _curBlockCaps[8]->walls[_sceneDrawVar2];
+	t = _visibleBlocks[8]->walls[_sceneDrawVarRight];
 	if (t)
-		generateBlockDrawingBufferF0(6, 2, t, 81, 2, 8);
+		generateVmpTileData(6, 2, t, 81, 2, 8);
 
-	t = _curBlockCaps[10]->walls[_sceneDrawVar3];
+	t = _visibleBlocks[10]->walls[_sceneDrawVarLeft];
 	if (t)
-		generateBlockDrawingBufferF1(14, 2, t, 81, 2, 8);
+		generateVmpTileDataFlipped(14, 2, t, 81, 2, 8);
 
-	t = _curBlockCaps[8]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[8]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(-4, 2, t, 159, 10, 8);
+		generateVmpTileData(-4, 2, t, 159, 10, 8);
 
-	t = _curBlockCaps[10]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[10]->walls[_sceneDrawVarDown];
 	if (hasWall(t))
-		generateBlockDrawingBufferF0(16, 2, t, 159, 10, 8);
+		generateVmpTileData(16, 2, t, 159, 10, 8);
 
-	t = _curBlockCaps[9]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[9]->walls[_sceneDrawVarDown];
 	if (t)
-		generateBlockDrawingBufferF0(6, 2, t, 159, 10, 8);
+		generateVmpTileData(6, 2, t, 159, 10, 8);
 
-	t = _curBlockCaps[12]->walls[_sceneDrawVar2];
+	t = _visibleBlocks[12]->walls[_sceneDrawVarRight];
 	if (t)
-		generateBlockDrawingBufferF0(3, 1, t, 45, 3, 12);
+		generateVmpTileData(3, 1, t, 45, 3, 12);
 
-	t = _curBlockCaps[14]->walls[_sceneDrawVar3];
+	t = _visibleBlocks[14]->walls[_sceneDrawVarLeft];
 	if (t)
-		generateBlockDrawingBufferF1(16, 1, t, 45, 3, 12);
+		generateVmpTileDataFlipped(16, 1, t, 45, 3, 12);
 
-	t = _curBlockCaps[12]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[12]->walls[_sceneDrawVarDown];
 	if (!(_wllWallFlags[t] & 8))
-		generateBlockDrawingBufferF0(-13, 1, t, 239, 16, 12);
+		generateVmpTileData(-13, 1, t, 239, 16, 12);
 
-	t = _curBlockCaps[14]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[14]->walls[_sceneDrawVarDown];
 	if (!(_wllWallFlags[t] & 8))
-		generateBlockDrawingBufferF0(19, 1, t, 239, 16, 12);
+		generateVmpTileData(19, 1, t, 239, 16, 12);
 
-	t = _curBlockCaps[13]->walls[_sceneDrawVar1];
+	t = _visibleBlocks[13]->walls[_sceneDrawVarDown];
 	if (t)
-		generateBlockDrawingBufferF0(3, 1, t, 239, 16, 12);
+		generateVmpTileData(3, 1, t, 239, 16, 12);
 
-	t = _curBlockCaps[15]->walls[_sceneDrawVar2];
-	t2 = _curBlockCaps[17]->walls[_sceneDrawVar3];
-	if (t)	// wall to the immediate left
-		generateBlockDrawingBufferF0(0, 0, t, 0, 3, 15);
-	if (t2) // wall to the immediate right
-		generateBlockDrawingBufferF1(19, 0, t2, 0, 3, 15);
+	t = _visibleBlocks[15]->walls[_sceneDrawVarRight];
+	t2 = _visibleBlocks[17]->walls[_sceneDrawVarLeft];
+	if (t)
+		generateVmpTileData(0, 0, t, 0, 3, 15);
+	if (t2)
+		generateVmpTileDataFlipped(19, 0, t2, 0, 3, 15);
 }
 
-void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) {
-	if (!_wllVmpMap[wllVmpIndex])
+void LoLEngine::generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) {
+	if (!_wllVmpMap[vmpMapIndex])
 		return;
 
-	uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330];
+	uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330];
 
-	for (int i = 0; i < numEntries; i++) {
-		uint16 *bl = &_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset];
-		for (int ii = 0; ii < len; ii++) {
-			if ((wllOffset + ii >= 0) && (wllOffset + ii < 22) && *vmp)
+	for (int i = 0; i < numBlocksY; i++) {
+		uint16 *bl = &_blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX];
+		for (int ii = 0; ii < numBlocksX; ii++) {
+			if ((startBlockX + ii >= 0) && (startBlockX + ii < 22) && *vmp)
 				*bl = *vmp;
 			bl++;
 			vmp++;
@@ -1353,18 +1508,18 @@
 	}
 }
 
-void LoLEngine::generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) {
-	if (!_wllVmpMap[wllVmpIndex])
+void LoLEngine::generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) {
+	if (!_wllVmpMap[vmpMapIndex])
 		return;
 
-	uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330];
+	uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330];
 
-	for (int i = 0; i < numEntries; i++) {
-		for (int ii = 0; ii < len; ii++) {
-			if ((wllOffset + ii) < 0 || (wllOffset + ii) > 21)
+	for (int i = 0; i < numBlocksY; i++) {
+		for (int ii = 0; ii < numBlocksX; ii++) {
+			if ((startBlockX + ii) < 0 || (startBlockX + ii) > 21)
 				continue;
 
-			uint16 v = vmp[i * len + (len - 1 - ii)];
+			uint16 v = vmp[i * numBlocksX + (numBlocksX - 1 - ii)];
 			if (!v)
 				continue;
 
@@ -1373,7 +1528,7 @@
 			else
 				v |= 0x4000;
 
-			_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset + ii] = v;
+			_blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX + ii] = v;
 		}
 	}
 }
@@ -1384,48 +1539,51 @@
 	return true;
 }
 
-void LoLEngine::assignBlockCaps(int block, int direction) {
+void LoLEngine::assignVisibleBlocks(int block, int direction) {
 	for (int i = 0; i < 18; i++) {
 		uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3ff;
-		_currentBlockPropertyIndex[i] = t;
+		_visibleBlockIndex[i] = t;
 
-		_curBlockCaps[i] = &_levelBlockProperties[t];
+		_visibleBlocks[i] = &_levelBlockProperties[t];
 		_lvlShapeLeftRight[i] = _lvlShapeLeftRight[18 + i] = -1;
 	}
 }
 
-void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum) {
+void LoLEngine::drawVcnBlocks() {
 	uint8 *d = _sceneWindowBuffer;
+	uint16 *bdb = _blockDrawingBuffer;
 
 	for (int y = 0; y < 15; y++) {
 		for (int x = 0; x < 22; x++) {
-			bool flag = false;
+			bool horizontalFlip = false;
 			int remainder = 0;
 
-			uint16 vcnOffset = *blockDrawingBuffer++;
+			uint16 vcnOffset = *bdb++;
 
 			if (vcnOffset & 0x8000) {
+				// this renders a wall block over the transparent pixels of a floor/ceiling block 
 				remainder = vcnOffset - 0x8000;
 				vcnOffset = 0;
 			}
 
 			if (vcnOffset & 0x4000) {
-				flag = true;
+				horizontalFlip = true;
 				vcnOffset &= 0x3fff;
 			}
 
 			if (!vcnOffset) {
-				vcnOffset = blockDrawingBuffer[329];
+				// floor/ceiling blocks
+				vcnOffset = bdb[329];
 				if (vcnOffset & 0x4000) {
-					flag = true;
+					horizontalFlip = true;
 					vcnOffset &= 0x3fff;
 				}
 			}
 
-			uint8 shift = vcnShift[vcnOffset];
-			uint8 *src = &vcnBlocks[vcnOffset << 5];
+			uint8 shift = _vcnShift[vcnOffset];
+			uint8 *src = &_vcnBlocks[vcnOffset << 5];
 
-			if (flag) {
+			if (horizontalFlip) {
 				for (int blockY = 0; blockY < 8; blockY++) {
 					src += 3;
 					for (int blockX = 0; blockX < 4; blockX++) {
@@ -1450,17 +1608,17 @@
 
 			if (remainder) {
 				d -= 8;
-				flag = false;
+				horizontalFlip = false;
 
 				if (remainder & 0x4000) {
 					remainder &= 0x3fff;
-					flag = true;
+					horizontalFlip = true;
 				}
 
-				shift = vcnShift[remainder];
-				src = &vcnBlocks[remainder << 5];
+				shift = _vcnShift[remainder];
+				src = &_vcnBlocks[remainder << 5];
 
-				if (flag) {
+				if (horizontalFlip) {
 					for (int blockY = 0; blockY < 8; blockY++) {
 						src += 3;
 						for (int blockX = 0; blockX < 4; blockX++) {
@@ -1499,13 +1657,13 @@
 		d += 1232;
 	}
 
-	_screen->copyBlockToPage(pageNum, 112, 0, 176, 120, _sceneWindowBuffer);
+	_screen->copyBlockToPage(_sceneDrawPage1, 112, 0, 176, 120, _sceneWindowBuffer);
 }
 
 void LoLEngine::drawSceneShapes() {
 	for (int i = 0; i < 18; i++) {
 		uint8 t = _dscTileIndex[i];
-		uint8 s = _curBlockCaps[t]->walls[_sceneDrawVar1];
+		uint8 s = _visibleBlocks[t]->walls[_sceneDrawVarDown];
 
 		int16 x1 = 0;
 		int16 x2 = 0;
@@ -1527,7 +1685,7 @@
 
 		drawBlockEffects(t, 0);
 
-		if (_curBlockCaps[t]->assignedObjects && (w & 0x80))
+		if (_visibleBlocks[t]->assignedObjects && (w & 0x80))
 			drawBlockObjects(t);
 
 		drawBlockEffects(t, 1);
@@ -1554,7 +1712,7 @@
 		int m = index * 18;
 
 		for (int i = 0; i < 18; i++) {
-			uint8 d = _curBlockCaps[i]->walls[_sceneDrawVar1];
+			uint8 d = _visibleBlocks[i]->walls[_sceneDrawVarDown];
 			uint8 a = _wllWallFlags[d];
 
 			if (a & 8) {
@@ -1650,7 +1808,7 @@
 			continue;
 
 		uint8 d = (_currentDirection + _dscUnk1[s]) & 3;
-		int8 l = _wllShapeMap[_curBlockCaps[index]->walls[d]];
+		int8 l = _wllShapeMap[_visibleBlocks[index]->walls[d]];
 
 		uint8 *shapeData = 0;
 
@@ -1716,7 +1874,7 @@
 
 void LoLEngine::drawBlockEffects(int index, int type) {
 	static const int16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 };
-	uint8 flg = _curBlockCaps[index]->flags;
+	uint8 flg = _visibleBlocks[index]->flags;
 	// flags: 0x10 = ice wall, 0x20 = teleporter, 0x40 = blue slime spot, 0x80 = blood spot
 	if (!(flg & 0xf0))
 		return;
@@ -1734,8 +1892,8 @@
 		
 		calcCoordinatesAddDirectionOffset(x, y, _currentDirection);
 
-		x |= ((_currentBlockPropertyIndex[index] & 0x1f) << 8);
-		y |= ((_currentBlockPropertyIndex[index] & 0xffe0) << 3);
+		x |= ((_visibleBlockIndex[index] & 0x1f) << 8);
+		y |= ((_visibleBlockIndex[index] & 0xffe0) << 3);
 
 		drawItemOrMonster(_effectShapes[type], ovl, x, y, 0, (type == 1) ? -20 : 0, drawFlag, -1, false);
 	}

Modified: scummvm/trunk/engines/kyra/script_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/script_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -98,7 +98,7 @@
 		return true;
 
 	for (int i = 0; i < 15; i++) {
-		if (_currentBlockPropertyIndex[i] == func) {
+		if (_visibleBlockIndex[i] == func) {
 			_sceneUpdateRequired = true;
 			return true;
 		}
@@ -212,6 +212,15 @@
 	return makeItem(stackPos(0), stackPos(1), stackPos(2));
 }
 
+int LoLEngine::olol_createLevelItem(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setItemProperty(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
+	int item = makeItem(stackPos(0), stackPos(1), stackPos(2));
+	if (item == -1)
+		return item;
+	placeMoveLevelItem(item, stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
+	return item;
+}
+
 int LoLEngine::olol_getItemPara(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getItemPara(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	if (!stackPos(0))
@@ -458,6 +467,18 @@
 	return 1;
 }
 
+int LoLEngine::olol_setSequenceButtons(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSequenceButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	setSequenceButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	return 1;
+}
+
+int LoLEngine::olol_setDefaultButtonState(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDefaultButtonState(%p)", (const void *)script);
+	setDefaultButtonState();
+	return 1;
+}
+
 int LoLEngine::olol_checkRectForMousePointer(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_checkRectForMousePointer(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
 	return posWithinRect(_mouseX, _mouseY, stackPos(0), stackPos(1), stackPos(2), stackPos(3)) ? 1 : 0;
@@ -465,7 +486,7 @@
 
 int LoLEngine::olol_clearDialogueField(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_clearDialogueField(%p) (%d)", (const void *)script, stackPos(0));
-	if (_hideControls && (!textEnabled()))
+	if (_currentControlMode && (!textEnabled()))
 		return 1;
 
 	_screen->setScreenDim(5);
@@ -489,6 +510,12 @@
 	return 1;
 }
 
+int LoLEngine::olol_fadeToBlack(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadeToBlack(%p) (%d)", (const void *)script, stackPos(0));
+	_screen->fadeToBlack(10);
+	return 1;
+}
+
 int LoLEngine::olol_fadePalette(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadePalette(%p)", (const void *)script);
 	_screen->fadePalette(_screen->getPalette(3), 10);
@@ -602,7 +629,7 @@
 	case 8:
 		_updateFlags = b;
 		if (b == 1) {
-			if (!textEnabled() || (!(_hideControls & 2)))
+			if (!textEnabled() || (!(_currentControlMode & 2)))
 				timerUpdatePortraitAnimations(1);
 			disableSysTimer(2);
 		} else {
@@ -735,6 +762,45 @@
 	return 1;
 }
 
+int LoLEngine::olol_redrawPlayfield(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_redrawPlayfield(%p)", (const void *)script);
+	if (_screen->_fadeFlag != 2)
+		_screen->fadeClearSceneWindow(10);
+	gui_drawPlayField();
+	setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
+	_screen->_fadeFlag = 0;
+	return 1;
+}
+
+int LoLEngine::olol_loadNewLevel(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadNewLevel(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+	_screen->fadeClearSceneWindow(10);
+	_screen->fillRect(112, 0, 288, 120, 0);
+	disableSysTimer(2);
+	
+	for (int i = 0; i < 8; i++) {
+		if (!_flyingObjects[i].enable || _flyingObjects[i].a)
+			continue;
+		endObjectFlight(&_flyingObjects[i], _flyingObjects[i].x, _flyingObjects[i].y, 1);
+	}
+
+	resetDoors();
+
+	///////////////////////
+	// TODO: generate temp files
+
+	_currentBlock = stackPos(1);
+	_currentDirection = stackPos(2);
+	calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80);
+
+	loadLevel(stackPos(0));
+
+	enableSysTimer(2);
+
+	script->ip = 0;
+	return 1;
+}
+
 int LoLEngine::olol_dummy0(EMCState *script) {
 	return 0;
 }
@@ -865,6 +931,41 @@
 	return 1;
 }
 
+int LoLEngine::olol_characterJoinsParty(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterJoinsParty(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+
+	int16 id = stackPos(0);
+	if (id < 0)
+		id = -id;
+
+	for (int i = 0; i < 4; i++) {
+		if (!(_characters[i].flags & 1) || _characters[i].id != id)
+			continue;
+
+		_characters[i].flags &= 0xfffe;
+		calcCharPortraitXpos();
+		
+		if (!_updateFlags) {
+			gui_enableDefaultPlayfieldButtons();
+			gui_drawPlayField();
+		}
+
+		if (_selectedCharacter == i)
+			_selectedCharacter = 0;
+
+		return 1;
+	}
+
+	addCharacter(id);
+
+	if (!_updateFlags) {
+		gui_enableDefaultPlayfieldButtons();
+		gui_drawPlayField();
+	}
+
+	return 1;
+}
+
 int LoLEngine::olol_loadTimScript(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadTimScript(%p) (%d, %s)", (const void *)script, stackPos(0), stackPosString(1));
 	if (_activeTim[stackPos(0)])
@@ -886,15 +987,15 @@
 	return 1;
 }
 
-int LoLEngine::olol_initAnimatedDialogue(EMCState *script) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0));
-	initAnimatedDialogue(stackPos(0));
+int LoLEngine::olol_initSceneWindowDialogue(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0));
+	initSceneWindowDialogue(stackPos(0));
 	return 1;
 }
 
-int LoLEngine::olol_restoreAfterAnimatedDialogue(EMCState *script) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0));
-	restoreAfterAnimatedDialogue(stackPos(0));
+int LoLEngine::olol_restoreAfterSceneWindowDialogue(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0));
+	restoreAfterSceneWindowDialogue(stackPos(0));
 	return 1;
 }
 
@@ -943,6 +1044,48 @@
 	return _wllWallFlags[_levelBlockProperties[stackPos(0)].walls[stackPos(1) & 3]];
 }
 
+int LoLEngine::olol_changeMonsterSettings(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_changeMonsterSettings(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+	if (stackPos(0) == -1)
+		return 1;
+
+	MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff];
+
+	int16 d = stackPos(2);
+	uint16 x = 0;
+	uint16 y = 0;
+
+	switch (stackPos(1)) {
+		case 0:
+			setMonsterMode(m, d);
+			break;
+
+		case 1:
+			m->might = d;
+			break;
+
+		case 2:
+			calcCoordinates(x, y, d, m->x & 0xff, m->y & 0xff);
+			if (!walkMonsterCheckDest(x, y, m, 7))
+				placeMonster(m, x, y);
+			break;
+
+		case 3:
+			setMonsterDirection(m, d << 1);
+			break;
+
+		case 6:
+			m->flags |= d;
+			break;
+
+		default:
+			break;
+	}
+
+	return 1;
+}
+
+
 int LoLEngine::olol_playCharacterScriptChat(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_playCharacterScriptChat(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
 	snd_stopSpeech(1);
@@ -1047,6 +1190,19 @@
 	return 1;
 }
 
+int LoLEngine::olol_dummy1(EMCState *script) {
+	return 1;
+}
+
+int LoLEngine::olol_suspendMonster(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_suspendMonster(%p) (%d)", (const void *)script, stackPos(0));
+	MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff];
+	setMonsterMode(m, 14);
+	checkSceneUpdateNeed(m->blockPropertyIndex);
+	placeMonster(m, 0, 0);
+	return 1;
+}
+
 int LoLEngine::olol_setDoorState(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDoorState(%p) (%d)", (const void *)script, stackPos(0));
 	_emcDoorState = stackPos(0);
@@ -1071,18 +1227,35 @@
 	return 1;
 }
 
-int LoLEngine::olol_initNonAnimatedDialogue(EMCState *script) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initNonAnimatedDialogue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
-	initNonAnimatedDialogue(stackPos(0), stackPos(1));
+int LoLEngine::olol_initDialogueSequence(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initDialogueSequence(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	initDialogueSequence(stackPos(0), stackPos(1));
 	return 1;
 }
 
-int LoLEngine::olol_restoreAfterNonAnimatedDialogue(EMCState *script) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterNonAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0));
-	restoreAfterNonAnimatedDialogue(stackPos(0));
+int LoLEngine::olol_restoreAfterDialogueSequence(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterDialogueSequence(%p) (%d)", (const void *)script, stackPos(0));
+	restoreAfterDialogueSequence(stackPos(0));
 	return 1;
 }
 
+int LoLEngine::olol_setSpecialSceneButtons(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSpecialSceneButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	setSpecialSceneButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	return 1;
+}
+
+int LoLEngine::olol_prepareSpecialScene(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_prepareSpecialScene(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
+	prepareSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
+	return 1;
+}
+
+int LoLEngine::olol_restoreAfterSpecialScene(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSpecialScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
+	return restoreAfterSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
+}
+
 int LoLEngine::olol_assignCustomSfx(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_assignCustomSfx(%p) (%s, %d)", (const void *)script, stackPosString(0), stackPos(1));
 	const char *c = stackPosString(0);
@@ -1100,17 +1273,29 @@
 	return 0;
 }
 
-int LoLEngine::olol_resetPortraitsArea(EMCState *script) {
-	resetPortraitsArea();
+int LoLEngine::olol_resetPortraitsAndDisableSysTimer(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_resetPortraitsAndDisableSysTimer(%p)", (const void *)script);
+	resetPortraitsAndDisableSysTimer();
 	return 1;
 }
 
 int LoLEngine::olol_enableSysTimer(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableSysTimer(%p)", (const void *)script);
 	_hideInventory = 0;
 	enableSysTimer(2);
 	return 1;
 }
 
+int LoLEngine::olol_disableControls(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_disableControls(%p) (%d)", (const void *)script, stackPos(0));
+	return gui_disableControls(stackPos(0));
+}
+
+int LoLEngine::olol_enableControls(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableControls(%p)", (const void *)script);
+	return gui_enableControls();
+}
+
 int LoLEngine::olol_queueSpeech(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_queueSpeech(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	if (stackPos(0) && stackPos(1)) {
@@ -1140,6 +1325,11 @@
 	return 0;
 }
 
+int LoLEngine::olol_getLanguage(EMCState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getLanguage(%p)", (const void *)script);
+	return _lang;
+}
+
 #pragma mark -
 
 int LoLEngine::tlol_setupPaletteFade(const TIM *tim, const uint16 *param) {
@@ -1199,15 +1389,15 @@
 	return 1;
 }
 
-int LoLEngine::tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]);
-	initAnimatedDialogue(param[0]);
+int LoLEngine::tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]);
+	initSceneWindowDialogue(param[0]);
 	return 1;
 }
 
-int LoLEngine::tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param) {
-	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]);
-	restoreAfterAnimatedDialogue(param[0]);
+int LoLEngine::tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param) {
+	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]);
+	restoreAfterSceneWindowDialogue(param[0]);
 	return 1;
 }
 
@@ -1388,7 +1578,7 @@
 
 	// 0x10
 	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(olol_createLevelItem);
 	Opcode(olol_getItemPara);
 	Opcode(olol_getCharacterStat);
 
@@ -1408,19 +1598,19 @@
 	Opcode(olol_getDirection);
 	OpcodeUnImpl();
 	Opcode(olol_setMusicTrack);
-	OpcodeUnImpl();
+	Opcode(olol_setSequenceButtons);
 
 	// 0x20
-	OpcodeUnImpl();
+	Opcode(olol_setDefaultButtonState);
 	Opcode(olol_checkRectForMousePointer);
 	Opcode(olol_clearDialogueField);
 	Opcode(olol_setupBackgroundAnimationPart);
 
 	// 0x24
 	Opcode(olol_startBackgroundAnimation);
-	OpcodeUnImpl();
-	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(o1_hideMouse);
+	Opcode(o1_showMouse);
+	Opcode(olol_fadeToBlack);
 
 	// 0x28
 	Opcode(olol_fadePalette);
@@ -1450,11 +1640,11 @@
 	Opcode(olol_initMonster);
 	Opcode(olol_fadeClearSceneWindow);
 	Opcode(olol_fadeSequencePalette);
-	OpcodeUnImpl();
+	Opcode(olol_redrawPlayfield);
 
 	// 0x3C
+	Opcode(olol_loadNewLevel);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 	Opcode(olol_dummy0);
 	Opcode(olol_loadMonsterProperties);
 
@@ -1474,7 +1664,7 @@
 	Opcode(olol_setScriptTimer);
 	Opcode(olol_createHandItem);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(olol_characterJoinsParty);
 
 	// 0x4C
 	OpcodeUnImpl();
@@ -1484,8 +1674,8 @@
 
 	// 0x50
 	Opcode(olol_releaseTimScript);
-	Opcode(olol_initAnimatedDialogue);
-	Opcode(olol_restoreAfterAnimatedDialogue);
+	Opcode(olol_initSceneWindowDialogue);
+	Opcode(olol_restoreAfterSceneWindowDialogue);
 	Opcode(olol_getItemInHand);
 
 	// 0x54
@@ -1498,7 +1688,7 @@
 	Opcode(olol_processDialogue);
 	Opcode(olol_stopTimScript);
 	Opcode(olol_getWallFlags);
-	OpcodeUnImpl();
+	Opcode(olol_changeMonsterSettings);
 
 	// 0x5C
 	OpcodeUnImpl();
@@ -1550,9 +1740,9 @@
 
 	// 0x7C
 	Opcode(olol_setNextFunc);
+	Opcode(olol_dummy1);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(olol_suspendMonster);
 
 	// 0x80
 	OpcodeUnImpl();
@@ -1573,16 +1763,16 @@
 	Opcode(olol_restorePage5);
 
 	// 0x8C
-	Opcode(olol_initNonAnimatedDialogue);
-	Opcode(olol_restoreAfterNonAnimatedDialogue);
+	Opcode(olol_initDialogueSequence);
+	Opcode(olol_restoreAfterDialogueSequence);
+	Opcode(olol_setSpecialSceneButtons);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 
 	// 0x90
 	OpcodeUnImpl();
 	OpcodeUnImpl();
-	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(olol_prepareSpecialScene);
+	Opcode(olol_restoreAfterSpecialScene);
 
 	// 0x94
 	Opcode(olol_assignCustomSfx);
@@ -1593,7 +1783,7 @@
 	// 0x98
 	OpcodeUnImpl();
 	OpcodeUnImpl();
-	Opcode(olol_resetPortraitsArea);
+	Opcode(olol_resetPortraitsAndDisableSysTimer);
 	Opcode(olol_enableSysTimer);
 
 	// 0x9C
@@ -1629,14 +1819,14 @@
 	// 0xB0
 	OpcodeUnImpl();
 	OpcodeUnImpl();
-	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(olol_dummy1); // anim buffer select?
+	Opcode(olol_disableControls);
 
 	// 0xB4
+	Opcode(olol_enableControls);
 	OpcodeUnImpl();
 	OpcodeUnImpl();
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 
 	// 0xB8
 	OpcodeUnImpl();
@@ -1647,8 +1837,8 @@
 	// 0xBC
 	Opcode(olol_queueSpeech);
 	Opcode(olol_getItemPrice);
+	Opcode(olol_getLanguage);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 
 	Common::Array<const TIMOpcode*> *timTable = 0;
 	SetTimOpcodeTable(_timIntroOpcodes);
@@ -1668,8 +1858,8 @@
 	SetTimOpcodeTable(_timIngameOpcodes);
 
 	// 0x00
-	OpcodeTim(tlol_initAnimatedDialogue);
-	OpcodeTim(tlol_restoreAfterAnimatedDialogue);
+	OpcodeTim(tlol_initSceneWindowDialogue);
+	OpcodeTim(tlol_restoreAfterSceneWindowDialogue);
 	OpcodeTimUnImpl();
 	OpcodeTim(tlol_giveItem);
 

Modified: scummvm/trunk/engines/kyra/script_tim.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_tim.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/script_tim.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -936,10 +936,12 @@
 	anim->curFrame = p->firstFrame;
 	anim->cyclesCompleted = 0;
 
-	anim->wsa->setX(anim->x);
-	anim->wsa->setY(anim->y);
-	anim->wsa->setDrawPage(0);
-	anim->wsa->displayFrame(anim->curFrame - 1, 0, 0);
+	if (anim->wsa) {
+		anim->wsa->setX(anim->x);
+		anim->wsa->setY(anim->y);
+		anim->wsa->setDrawPage(0);
+		anim->wsa->displayFrame(anim->curFrame - 1, 0, 0);
+	}
 }
 
 void TIMInterpreter_LoL::stopBackgroundAnimation(int animIndex) {
@@ -1128,7 +1130,7 @@
 
 	_vm->updatePortraits();
 
-	if (!_vm->textEnabled() && _vm->_hideControls) {
+	if (!_vm->textEnabled() && _vm->_currentControlMode) {
 		_screen->setScreenDim(5);
 		const ScreenDim *d = _screen->getScreenDim(5);
 		_screen->fillRect(d->sx, d->sy + d->h - 9, d->sx + d->w - 1, d->sy + d->h - 1, d->unkA);

Modified: scummvm/trunk/engines/kyra/sprites_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sprites_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/sprites_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -228,7 +228,7 @@
 		return false;
 
 	for (int i = 0; i < 18; i++)
-		_curBlockCaps[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff];
+		_visibleBlocks[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff];
 
 	int16 fx1 = 0;
 	int16 fx2 = 0;
@@ -523,7 +523,7 @@
 }
 
 void LoLEngine::drawBlockObjects(int blockArrayIndex) {
-	LevelBlockProperty *l = _curBlockCaps[blockArrayIndex];
+	LevelBlockProperty *l = _visibleBlocks[blockArrayIndex];
 	uint16 s = l->assignedObjects;
 	ItemInPlay *i = findObject(s);
 
@@ -565,10 +565,10 @@
 				int shpIndex = _itemProperties[i->itemPropertyIndex].flags & 0x800 ? 7 : _itemProperties[i->itemPropertyIndex].shpIndex;
 				int ii = 0;
 				for (; ii < 8; ii++) {
-					if (!_flyingItems[ii].enable)
+					if (!_flyingObjects[ii].enable)
 						continue;
 
-					if (_flyingItems[ii].item == s)
+					if (_flyingObjects[ii].item == s)
 						break;
 				}
 
@@ -578,7 +578,7 @@
 				flg |= _flyingItemShapes[shpIndex].drawFlags;
 
 				if (ii != 8) {
-					switch (_currentDirection - (_flyingItems[ii].direction >> 1) + 3) {
+					switch (_currentDirection - (_flyingObjects[ii].direction >> 1) + 3) {
 						case 1:
 						case 5:
 							shpIndex = _flyingItemShapes[shpIndex].shapeFront;
@@ -764,7 +764,7 @@
 }
 
 void LoLEngine::redrawSceneItem() {
-	assignBlockCaps(_currentBlock, _currentDirection);
+	assignVisibleBlocks(_currentBlock, _currentDirection);
 	_screen->fillRect(112, 0, 287, 119, 0);
 
 	static const uint8 sceneClickTileIndex[] = { 13, 16};
@@ -775,7 +775,7 @@
 	for (int i = 0; i < 2; i++) {
 		uint8 tile = sceneClickTileIndex[i];
 		setLevelShapesDim(tile, x1, x2, 13);
-		uint16 s = _curBlockCaps[tile]->drawObjects;
+		uint16 s = _visibleBlocks[tile]->drawObjects;
 
 		int t = (i << 7) + 1;		
 		while (s) {

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -986,7 +986,7 @@
 		t->raceClassSex = file->readByte();
 		t->id = file->readSint16LE();
 		t->curFaceFrame = file->readByte();
-		t->nextFaceFrame = file->readByte();
+		t->defaultFaceFrame = file->readByte();
 		t->field_12 = file->readByte();
 		file->readUint32LE();
 		for (int ii = 0; ii < 8; ii++)

Modified: scummvm/trunk/engines/kyra/text_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/text_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -607,7 +607,7 @@
 	int y = 0;
 
 	if (_vm->_hideInventory && (_vm->_updateFlags & 2)) {
-		if (_vm->_hideControls || !(_vm->_updateFlags & 2)) {
+		if (_vm->_currentControlMode || !(_vm->_updateFlags & 2)) {
 			y = dim->sy + dim->h - 5;
 		} else {
 			x += 6;

Modified: scummvm/trunk/engines/kyra/timer_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/timer_lol.cpp	2009-03-24 05:38:39 UTC (rev 39652)
+++ scummvm/trunk/engines/kyra/timer_lol.cpp	2009-03-24 07:18:16 UTC (rev 39653)
@@ -117,9 +117,9 @@
 
 void LoLEngine::timerProcessFlyingObjects(int timerNum) {
 	for (int i = 0; i < 8; i++) {
-		if (!_flyingItems[i].enable)
+		if (!_flyingObjects[i].enable)
 			continue;
-		updateFlyingObjects(&_flyingItems[i]);
+		updateFlyingObjects(&_flyingObjects[i]);
 	}
 }
 


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