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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Fri May 2 16:46:30 CEST 2008


Revision: 31817
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31817&view=rev
Author:   lordhoto
Date:     2008-05-02 07:46:30 -0700 (Fri, 02 May 2008)

Log Message:
-----------
Started to refactor kyra2/kyra3 code to a common base. (regressions possible, compiling currently broken)

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/debugger.cpp
    scummvm/trunk/engines/kyra/debugger.h
    scummvm/trunk/engines/kyra/detection.cpp
    scummvm/trunk/engines/kyra/gui_v2.cpp
    scummvm/trunk/engines/kyra/gui_v2.h
    scummvm/trunk/engines/kyra/gui_v3.cpp
    scummvm/trunk/engines/kyra/gui_v3.h
    scummvm/trunk/engines/kyra/module.mk
    scummvm/trunk/engines/kyra/resource.h
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h
    scummvm/trunk/engines/kyra/staticres.cpp
    scummvm/trunk/engines/kyra/wsamovie.cpp
    scummvm/trunk/engines/kyra/wsamovie.h

Added Paths:
-----------
    scummvm/trunk/engines/kyra/animator_hof.cpp
    scummvm/trunk/engines/kyra/animator_mr.cpp
    scummvm/trunk/engines/kyra/items_hof.cpp
    scummvm/trunk/engines/kyra/items_mr.cpp
    scummvm/trunk/engines/kyra/kyra_hof.cpp
    scummvm/trunk/engines/kyra/kyra_mr.cpp
    scummvm/trunk/engines/kyra/kyra_mr.h
    scummvm/trunk/engines/kyra/saveload_hof.cpp
    scummvm/trunk/engines/kyra/saveload_mr.cpp
    scummvm/trunk/engines/kyra/scene_hof.cpp
    scummvm/trunk/engines/kyra/scene_mr.cpp
    scummvm/trunk/engines/kyra/screen_hof.cpp
    scummvm/trunk/engines/kyra/screen_hof.h
    scummvm/trunk/engines/kyra/screen_mr.cpp
    scummvm/trunk/engines/kyra/screen_mr.h
    scummvm/trunk/engines/kyra/script_hof.cpp
    scummvm/trunk/engines/kyra/script_mr.cpp
    scummvm/trunk/engines/kyra/sequences_hof.cpp
    scummvm/trunk/engines/kyra/sequences_mr.cpp
    scummvm/trunk/engines/kyra/text_hof.cpp
    scummvm/trunk/engines/kyra/text_hof.h
    scummvm/trunk/engines/kyra/text_mr.cpp
    scummvm/trunk/engines/kyra/text_mr.h
    scummvm/trunk/engines/kyra/timer_hof.cpp
    scummvm/trunk/engines/kyra/timer_mr.cpp

Removed Paths:
-------------
    scummvm/trunk/engines/kyra/animator_v2.cpp
    scummvm/trunk/engines/kyra/animator_v3.cpp
    scummvm/trunk/engines/kyra/items_v2.cpp
    scummvm/trunk/engines/kyra/items_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v2.cpp
    scummvm/trunk/engines/kyra/kyra_v2.h
    scummvm/trunk/engines/kyra/kyra_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v3.h
    scummvm/trunk/engines/kyra/saveload_v2.cpp
    scummvm/trunk/engines/kyra/saveload_v3.cpp
    scummvm/trunk/engines/kyra/scene_v2.cpp
    scummvm/trunk/engines/kyra/scene_v3.cpp
    scummvm/trunk/engines/kyra/screen_v2.cpp
    scummvm/trunk/engines/kyra/screen_v2.h
    scummvm/trunk/engines/kyra/screen_v3.cpp
    scummvm/trunk/engines/kyra/screen_v3.h
    scummvm/trunk/engines/kyra/script_v2.cpp
    scummvm/trunk/engines/kyra/script_v3.cpp
    scummvm/trunk/engines/kyra/sequences_v2.cpp
    scummvm/trunk/engines/kyra/sequences_v3.cpp
    scummvm/trunk/engines/kyra/text_v2.cpp
    scummvm/trunk/engines/kyra/text_v2.h
    scummvm/trunk/engines/kyra/text_v3.cpp
    scummvm/trunk/engines/kyra/text_v3.h
    scummvm/trunk/engines/kyra/timer_v2.cpp
    scummvm/trunk/engines/kyra/timer_v3.cpp

Copied: scummvm/trunk/engines/kyra/animator_hof.cpp (from rev 31808, scummvm/trunk/engines/kyra/animator_v2.cpp)
===================================================================
--- scummvm/trunk/engines/kyra/animator_hof.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/animator_hof.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -0,0 +1,391 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_hof.h"
+#include "kyra/wsamovie.h"
+
+#include "common/endian.h"
+
+namespace Kyra {
+
+void KyraEngine_HoF::restorePage3() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::restorePage3()");
+	screen()->copyBlockToPage(2, 0, 0, 320, 144, _gamePlayBuffer);
+}
+
+void KyraEngine_HoF::clearAnimObjects() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::clearAnimObjects()");
+	memset(_animObjects, 0, sizeof(_animObjects));
+
+	_animObjects[0].index = 0;
+	_animObjects[0].type = 0;
+	_animObjects[0].enabled = 1;
+	_animObjects[0].flags = 0x800;
+	_animObjects[0].width = 32;
+	_animObjects[0].height = 49;
+	_animObjects[0].width2 = 4;
+	_animObjects[0].height2 = 10;
+
+	for (int i = 1; i < 11; ++i) {
+		_animObjects[i].index = i;
+		_animObjects[i].type = 2;
+	}
+
+	for (int i = 11; i <= 40; ++i) {
+		_animObjects[i].index = i;
+		_animObjects[i].type = 1;
+		_animObjects[i].flags = 0x800;
+		_animObjects[i].width = 16;
+		_animObjects[i].height = 16;
+	}
+}
+
+void KyraEngine_HoF::drawAnimObjects() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::drawAnimObjects()");
+	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
+		if (!curObject->enabled)
+			continue;
+
+		int x = curObject->xPos2 - (_screen->getScreenDim(2)->sx << 3);
+		int y = curObject->yPos2 - _screen->getScreenDim(2)->sy;
+		int layer = 7;
+
+		if (curObject->flags & 0x800) {
+			if (curObject->animFlags)
+				layer = 0;
+			else
+				layer = getDrawLayer(curObject->xPos1, curObject->yPos1);
+		}
+		curObject->flags |= 0x800;
+
+		if (curObject->index)
+			drawSceneAnimObject(curObject, x, y, layer);
+		else
+			drawCharacterAnimObject(curObject, x, y, layer);
+	}
+}
+
+void KyraEngine_HoF::refreshAnimObjects(int force) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::refreshAnimObjects(%d)", force);
+	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
+		if (!curObject->enabled)
+			continue;
+		if (!curObject->needRefresh && !force)
+			continue;
+
+		int x = curObject->xPos2 - curObject->width2;
+		if (x < 0)
+			x = 0;
+		if (x >= 320)
+			x = 319;
+		int y = curObject->yPos2 - curObject->height2;
+		if (y < 0)
+			y = 0;
+		if (y >= 143)
+			y = 142;
+
+		int width = curObject->width + curObject->width2 + 8;
+		int height = curObject->height + curObject->height2*2;
+		if (width + x > 320)
+			width -= width + x - 322;
+		if (height + y > 143)
+			height -= height + y - 144;
+
+		_screen->hideMouse();
+		_screen->copyRegion(x, y, x, y, width, height, 2, 0, Screen::CR_NO_P_CHECK);
+		_screen->showMouse();
+
+		curObject->needRefresh = false;
+	}
+}
+
+void KyraEngine_HoF::updateItemAnimations() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::updateItemAnimations()");
+	bool nextFrame = false;
+
+	if (_itemAnimData[0].itemIndex == -1 || _inventorySaved)
+		return;	
+
+	const ItemAnimData_v2 *s = &_itemAnimData[_nextAnimItem];
+	ActiveItemAnim *a = &_activeItemAnim[_nextAnimItem];
+	
+	if (++_nextAnimItem == 14) {
+		_nextAnimItem = 0;
+		return;
+	}
+
+	uint32 ctime = _system->getMillis();
+	if (ctime < a->nextFrame)
+		return;
+
+	uint16 shpIdx = s->frames[a->currentFrame].index + 64;
+	if ((s->itemIndex == _handItemSet || s->itemIndex == _itemInHand) && (!_mouseState && _screen->isMouseVisible())) {
+		nextFrame = true;
+		_screen->setMouseCursor(8, 15, getShapePtr(shpIdx));
+	}
+
+	for (int i = 0; i < 10; i++) {
+		if (s->itemIndex == _mainCharacter.inventory[i]) {
+			nextFrame = true;
+			_screen->drawShape(2, getShapePtr(240 + i), 304, 184, 0, 0);
+			_screen->drawShape(2, getShapePtr(shpIdx), 304, 184, 0, 0);
+			_screen->copyRegion(304, 184, _inventoryX[i], _inventoryY[i], 16, 16, 2, 0);
+		}
+	}
+
+	_screen->updateScreen();
+
+	for (int i = 11; i < 40; i++) {
+		AnimObj *animObject = &_animObjects[i];
+		if (animObject->shapeIndex2 == s->itemIndex + 64) {
+			if (s->itemIndex == 121) {
+				int f = findItem(_mainCharacter.sceneId, 121);
+				int nx = _itemList[f].x - 4;
+				if (nx > 12) {
+					if (lineIsPassable(nx, _itemList[f].y)) {
+						animObject->xPos2 -= 4;
+						_itemList[f].x -= 4;
+					}
+				}
+			}
+			animObject->shapePtr = getShapePtr(shpIdx);
+			animObject->shapeIndex1 = shpIdx;
+			animObject->needRefresh = 1;
+			nextFrame = true;
+		}
+	}
+
+	if (nextFrame) {
+		a->nextFrame = _system->getMillis() + (s->frames[a->currentFrame].delay * _tickLength);
+		a->currentFrame = ++a->currentFrame % s->numFrames;
+	}
+}
+
+void KyraEngine_HoF::updateCharFacing() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::updateCharFacing()");
+	if (_mainCharacter.x1 > _mouseX)
+		_mainCharacter.facing = 5;
+	else
+		_mainCharacter.facing = 3;
+
+	_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
+	updateCharacterAnim(0);
+	refreshAnimObjectsIfNeed();
+}
+
+void KyraEngine_HoF::updateCharacterAnim(int) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::updateCharacterAnim(-)");
+	Character *c = &_mainCharacter;
+	AnimObj *animState = _animObjects;
+
+	animState->needRefresh = 1;
+	animState->specialRefresh = 1;
+
+	if (c->facing >= 1 && c->facing <= 3)
+		animState->flags |= 1;
+	else if (c->facing >= 5 && c->facing <= 7)
+		animState->flags &= ~1;
+
+	animState->xPos2 = animState->xPos1 = c->x1;
+	animState->yPos2 = animState->yPos1 = c->y1;
+	animState->shapePtr = getShapePtr(c->animFrame);
+	animState->shapeIndex1 = animState->shapeIndex2 = c->animFrame;
+
+	int xAdd = _shapeDescTable[c->animFrame-9].xAdd;
+	int yAdd = _shapeDescTable[c->animFrame-9].yAdd;
+
+	_charScaleX = _charScaleY = getScale(c->x1, c->y1);
+
+	animState->xPos2 += (xAdd * _charScaleX) >> 8;
+	animState->yPos2 += (yAdd * _charScaleY) >> 8;
+	animState->width2 = 8;
+	animState->height2 = 10;
+
+	_animList = deleteAnimListEntry(_animList, animState);
+	if (_animList)
+		_animList = addToAnimListSorted(_animList, animState);
+	else
+		_animList = initAnimList(_animList, animState);
+
+	updateCharPal(1);
+}
+
+void KyraEngine_HoF::updateSceneAnim(int anim, int newFrame) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::updateSceneAnim(%d, %d)", anim, newFrame);
+	AnimObj *animObject = &_animObjects[1+anim];
+	if (!animObject->enabled)
+		return;
+
+	animObject->needRefresh = 1;
+	animObject->specialRefresh = 1;
+	animObject->flags = 0;
+
+	if (_sceneAnims[anim].flags & 2)
+		animObject->flags |= 0x800;
+	else
+		animObject->flags &= ~0x800;
+
+	if (_sceneAnims[anim].flags & 4)
+		animObject->flags |= 1;
+	else
+		animObject->flags &= ~1;
+
+	if (_sceneAnims[anim].flags & 0x20) {
+		animObject->shapePtr = _sceneShapeTable[newFrame];
+		animObject->shapeIndex2 = 0xFFFF;
+		animObject->shapeIndex3 = 0xFFFF;
+		animObject->animNum = 0xFFFF;
+	} else {
+		animObject->shapePtr = 0;
+		animObject->shapeIndex3 = newFrame;
+		animObject->animNum = anim;
+	}
+
+	animObject->xPos1 = _sceneAnims[anim].x;
+	animObject->yPos1 = _sceneAnims[anim].y;
+	animObject->xPos2 = _sceneAnims[anim].x2;
+	animObject->yPos2 = _sceneAnims[anim].y2;
+
+	if (_sceneAnims[anim].flags & 2) {
+		_animList = deleteAnimListEntry(_animList, animObject);
+		if (!_animList)
+			_animList = initAnimList(_animList, animObject);
+		else
+			_animList = addToAnimListSorted(_animList, animObject);
+	}
+}
+
+void KyraEngine_HoF::drawSceneAnimObject(AnimObj *obj, int x, int y, int layer) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::drawSceneAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
+	if (obj->type == 1) {
+		if (obj->shapeIndex1 == 0xFFFF)
+			return;
+		int scale = getScale(obj->xPos1, obj->yPos1);
+		_screen->drawShape(2, getShapePtr(obj->shapeIndex1), x, y, 2, obj->flags | 4, layer, scale, scale);
+		return;
+	}
+
+	if (obj->shapePtr) {
+		_screen->drawShape(2, obj->shapePtr, x, y, 2, obj->flags, layer);
+	} else {
+		if (obj->shapeIndex3 == 0xFFFF || obj->animNum == 0xFFFF)
+			return;
+
+		int flags = 0x4000;
+		if (obj->flags & 0x800)
+			flags |= 0x8000;
+
+		if (_sceneAnims[obj->animNum].wsaFlag) {
+			x = y = 0;
+		} else {
+			x = obj->xPos2;
+			y = obj->yPos2;
+		}
+
+		_sceneAnimMovie[obj->animNum]->setX(x);
+		_sceneAnimMovie[obj->animNum]->setY(y);
+		_sceneAnimMovie[obj->animNum]->setDrawPage(2);
+		_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, int(flags | layer), 0, 0);
+	}
+}
+
+void KyraEngine_HoF::drawCharacterAnimObject(AnimObj *obj, int x, int y, int layer) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::drawCharacterAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
+	if (_drawNoShapeFlag || obj->shapeIndex1 == 0xFFFF)
+		return;
+	_screen->drawShape(2, getShapePtr(obj->shapeIndex1), x, y, 2, obj->flags | 4, layer, _charScaleX, _charScaleY);
+}
+
+void KyraEngine_HoF::addItemToAnimList(int item) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::addItemToAnimList(%d)", item);
+	restorePage3();
+
+	AnimObj *animObj = &_animObjects[11+item];
+
+	animObj->enabled = 1;
+	animObj->needRefresh = 1;
+	animObj->specialRefresh = 1;
+
+	int itemId = _itemList[item].id;
+
+	animObj->xPos2 = animObj->xPos1 = _itemList[item].x;
+	animObj->yPos2 = animObj->yPos1 = _itemList[item].y;
+
+	animObj->shapePtr = getShapePtr(64+itemId);
+	animObj->shapeIndex2 = animObj->shapeIndex1 = 64+itemId;
+
+	int scaleY, scaleX;
+	scaleY = scaleX = getScale(animObj->xPos1, animObj->yPos1);
+
+	uint8 *shapePtr = getShapePtr(64+itemId);
+	animObj->xPos3 = (animObj->xPos2 -= (_screen->getShapeScaledWidth(shapePtr, scaleX) >> 1));
+	animObj->yPos3 = (animObj->yPos2 -= _screen->getShapeScaledHeight(shapePtr, scaleY));
+
+	animObj->width2 = animObj->height2 = 0;
+
+	_animList = addToAnimListSorted(_animList, animObj);
+	animObj->needRefresh = 1;
+	animObj->specialRefresh = 1;
+}
+
+void KyraEngine_HoF::deleteItemAnimEntry(int item) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::deleteItemAnimEntry(%d)", item);
+	AnimObj *animObj = &_animObjects[11+item];
+
+	restorePage3();
+
+	animObj->shapePtr = 0;
+	animObj->shapeIndex1 = 0xFFFF;
+	animObj->shapeIndex2 = 0xFFFF;
+	animObj->needRefresh = 1;
+	animObj->specialRefresh = 1;
+
+	refreshAnimObjectsIfNeed();
+
+	animObj->enabled = 0;
+	_animList = deleteAnimListEntry(_animList, animObj);
+}
+
+void KyraEngine_HoF::setCharacterAnimDim(int w, int h) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::setCharacterAnimDim(%d, %d)", w, h);
+	restorePage3();
+
+	_animObj0Width = _animObjects[0].width;
+	_animObj0Height = _animObjects[0].height;
+
+	_animObjects[0].width = w;
+	_animObjects[0].height = h;
+}
+
+void KyraEngine_HoF::resetCharacterAnimDim() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_HoF::resetCharacterAnimDim()");
+	restorePage3();
+
+	_animObjects[0].width = _animObj0Width;
+	_animObjects[0].height = _animObj0Height;
+}
+
+} // end of namespace Kyra
+

Copied: scummvm/trunk/engines/kyra/animator_mr.cpp (from rev 31808, scummvm/trunk/engines/kyra/animator_v3.cpp)
===================================================================
--- scummvm/trunk/engines/kyra/animator_mr.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/animator_mr.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -0,0 +1,483 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_mr.h"
+#include "kyra/resource.h"
+#include "kyra/wsamovie.h"
+
+namespace Kyra {
+
+void KyraEngine_MR::restorePage3() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::restorePage3()");
+	screen()->copyBlockToPage(2, 0, 0, 320, 200, _gamePlayBuffer);
+}
+
+void KyraEngine_MR::clearAnimObjects() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::clearAnimObjects()");
+
+	for (int i = 0; i < 67; ++i)
+		_animObjects[i].enabled = false;
+
+	_animObjects[0].index = 0;
+	_animObjects[0].type = 0;
+	_animObjects[0].enabled = true;
+	_animObjects[0].specialRefresh = 1;
+	_animObjects[0].flags = 0x800;
+	_animObjects[0].width = 57;
+	_animObjects[0].height = 91;
+	_animObjects[0].width2 = 4;
+	_animObjects[0].height2 = 10;
+
+	for (int i = 1; i < 17; ++i) {
+		_animObjects[i].index = i;
+		_animObjects[i].type = 2;
+		_animObjects[i].flags = 0;
+		_animObjects[i].enabled = false;
+		_animObjects[i].needRefresh = 0;
+		_animObjects[i].specialRefresh = 1;
+	}
+
+	for (int i = 17; i <= 66; ++i) {
+		_animObjects[i].index = i;
+		_animObjects[i].type = 1;
+		_animObjects[i].specialRefresh = 1;
+		_animObjects[i].flags = 0x800;
+		_animObjects[i].width = 24;
+		_animObjects[i].height = 20;
+		_animObjects[i].width2 = 0;
+		_animObjects[i].height2 = 0;
+	}
+}
+
+void KyraEngine_MR::animSetupPaletteEntry(AnimObj *anim) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::animSetupPaletteEntry(%p)", (const void*)anim);
+	int layer = _screen->getLayer(anim->xPos1, anim->yPos1) - 1;
+	int16 count = 0;
+	for (int i = 0; i < 3; ++i)
+		count += _sceneDatPalette[layer*3+i];
+	count /= 3;
+	count *= -1;
+	count = MAX<int16>(0, MIN<int16>(count, 10));
+	anim->palette = count / 3;
+}
+
+void KyraEngine_MR::drawAnimObjects() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::drawAnimObjects()");
+	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
+		if (!curObject->enabled)
+			continue;
+
+		int x = curObject->xPos2 - (_screen->getScreenDim(2)->sx << 3);
+		int y = curObject->yPos2 - _screen->getScreenDim(2)->sy;
+		int layer = 7;
+
+		if (curObject->flags & 0x800) {
+			if (!curObject->specialRefresh)
+				layer = 0;
+			else
+				layer = getDrawLayer(curObject->xPos1, curObject->yPos1);
+		}
+
+		if (curObject->index)
+			drawSceneAnimObject(curObject, x, y, layer);
+		else
+			drawCharacterAnimObject(curObject, x, y, layer);
+	}
+}
+
+void KyraEngine_MR::drawSceneAnimObject(AnimObj *obj, int x, int y, int layer) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::drawSceneAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
+	if (obj->type == 1) {
+		if (obj->shapeIndex1 == 0xFFFF)
+			return;
+		int scale = getScale(obj->xPos1, obj->yPos1);
+		_screen->drawShape(2, getShapePtr(obj->shapeIndex1), x, y, 2, obj->flags | 0x104, _paletteOverlay, obj->palette, layer, scale, scale);
+	} else {
+		if (obj->shapePtr) {
+			_screen->drawShape(2, obj->shapePtr, x, y, 2, obj->flags, 7);
+		} else {
+			if (obj->shapeIndex3 == 0xFFFF || obj->animNum == 0xFFFF)
+				return;
+			uint16 flags = 0x4000;
+			if (obj->flags & 0x800)
+				flags |= 0x8000;
+			x = obj->xPos2 - _sceneAnimMovie[obj->animNum]->xAdd();
+			y = obj->yPos2 - _sceneAnimMovie[obj->animNum]->yAdd();
+			_sceneAnimMovie[obj->animNum]->setDrawPage(2);
+			_sceneAnimMovie[obj->animNum]->setX(x);
+			_sceneAnimMovie[obj->animNum]->setY(y);
+			_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, flags | layer);
+		}
+	}
+}
+
+void KyraEngine_MR::drawCharacterAnimObject(AnimObj *obj, int x, int y, int layer) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::drawCharacterAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
+	if (_drawNoShapeFlag)
+		return;
+
+	if (_mainCharacter.animFrame < 9)
+		_mainCharacter.animFrame = 87;
+
+	if (obj->shapeIndex1 == 0xFFFF || _mainCharacter.animFrame == 87)
+		return;
+
+	_screen->drawShape(2, getShapePtr(421), _mainCharacter.x3, _mainCharacter.y3, 2, obj->flags | 0x304, _paletteOverlay, 3, layer, _charScale, _charScale);
+	uint8 *shape = getShapePtr(_mainCharacter.animFrame);
+	if (shape)
+		_screen->drawShape(2, shape, x, y, 2, obj->flags | 4, layer, _charScale, _charScale);
+}
+
+void KyraEngine_MR::refreshAnimObjects(int force) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::refreshAnimObjects(%d)", force);
+	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
+		if (!curObject->enabled)
+			continue;
+		if (!curObject->needRefresh && !force)
+			continue;
+
+		const int scale = (curObject->index == 0) ? _charScale : 0;
+
+		int x = curObject->xPos2 - curObject->width2;
+		if (scale)
+			x -= (0x100 - scale) >> 4;
+
+		if (x < 0)
+			x = 0;
+		if (x >= 320)
+			x = 319;
+
+		int y = curObject->yPos2 - curObject->height2;
+		if (scale)
+			y -= (0x100 - scale) >> 3;
+		if (y < 0)
+			y = 0;
+		if (y >= 187)
+			y = 186;
+
+		int width = curObject->width + curObject->width2 + 8;
+		int height = curObject->height + curObject->height2*2;
+		if (width + x > 320)
+			width -= width + x - 322;
+
+		const int maxY = _inventoryState ? 143 : 187;
+		if (height + y > maxY)
+			height -= height + y - (maxY + 1);
+
+		if (height > 0) {
+			_screen->hideMouse();
+			_screen->copyRegion(x, y, x, y, width, height, 2, 0, Screen::CR_NO_P_CHECK);
+			_screen->showMouse();
+		}
+
+		curObject->needRefresh = false;
+	}
+}
+
+void KyraEngine_MR::updateCharacterAnim(int charId) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::updateCharacterAnim(%d)", charId);
+
+	AnimObj *obj = &_animObjects[0];
+	obj->needRefresh = true;
+	obj->flags &= ~1;
+	obj->xPos1 = _mainCharacter.x1;
+	obj->yPos1 = _mainCharacter.y1;
+	obj->shapePtr = getShapePtr(_mainCharacter.animFrame);
+	obj->shapeIndex1 = obj->shapeIndex2 = _mainCharacter.animFrame;
+
+	int shapeOffsetX = 0, shapeOffsetY = 0;
+	if (_mainCharacter.animFrame >= 50 && _mainCharacter.animFrame <= 87) {
+		shapeOffsetX = _malcolmShapeXOffset;
+		shapeOffsetY = _malcolmShapeYOffset;
+	} else {
+		shapeOffsetX = _newShapeXAdd;
+		shapeOffsetY = _newShapeYAdd;
+	}
+
+	obj->xPos2 = _mainCharacter.x1;
+	obj->yPos2 = _mainCharacter.y1;
+	_charScale = getScale(_mainCharacter.x1, _mainCharacter.y1);
+	obj->xPos2 += (shapeOffsetX * _charScale) >> 8;
+	obj->yPos2 += (shapeOffsetY * _charScale) >> 8;
+	_mainCharacter.x3 = _mainCharacter.x1 - (_charScale >> 4) - 1;
+	_mainCharacter.y3 = _mainCharacter.y1 - (_charScale >> 6) - 1;
+	if (_charBackUpWidth2 == -1) {
+		obj->width2 = 4;
+		obj->height2 = 10;
+	}
+
+	for (int i = 1; i <= 16; ++i) {
+		if (_animObjects[i].enabled && _animObjects[i].specialRefresh)
+			_animObjects[i].needRefresh = true;
+	}
+
+	_animList = deleteAnimListEntry(_animList, obj);
+	if (_animList)
+		_animList = addToAnimListSorted(_animList, obj);
+	else
+		_animList = initAnimList(_animList, obj);
+
+	if (!_loadingState)
+		updateCharPal(1);
+}
+
+void KyraEngine_MR::updateSceneAnim(int anim, int newFrame) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::updateSceneAnim(%d, %d)", anim, newFrame);
+	AnimObj *animObject = &_animObjects[1+anim];
+	if (!animObject->enabled)
+		return;
+
+	animObject->needRefresh = true;
+
+	if (_sceneAnims[anim].flags & 2)
+		animObject->flags |= 1;
+	else
+		animObject->flags &= ~1;
+
+	if (_sceneAnims[anim].flags & 4) {
+		animObject->shapePtr = _sceneShapes[newFrame];
+		animObject->shapeIndex2 = 0xFFFF;
+		animObject->shapeIndex3 = 0xFFFF;
+		animObject->animNum = 0xFFFF;
+	} else {
+		animObject->shapePtr = 0;
+		animObject->shapeIndex3 = newFrame;
+		animObject->animNum = anim;
+	}
+
+	animObject->xPos1 = _sceneAnims[anim].x;
+	animObject->yPos1 = _sceneAnims[anim].y;
+	animObject->xPos2 = _sceneAnims[anim].x2;
+	animObject->yPos2 = _sceneAnims[anim].y2;
+
+	if (_sceneAnims[anim].flags & 0x20) {
+		_animList = deleteAnimListEntry(_animList, animObject);
+		if (!_animList)
+			_animList = initAnimList(_animList, animObject);
+		else
+			_animList = addToAnimListSorted(_animList, animObject);
+	}
+}
+
+void KyraEngine_MR::setupSceneAnimObject(int animId, uint16 flags, int x, int y, int x2, int y2, int w,
+										int h, int unk10, int specialSize, int unk14, int shape, const char *filename) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::setupSceneAnimObject(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')",
+			animId, flags, x, y, x2, y2, w, h, unk10, specialSize, unk14, shape, filename);
+	restorePage3();
+	SceneAnim &anim = _sceneAnims[animId];
+	anim.flags = flags;
+	anim.x = x;
+	anim.y = y;
+	anim.x2 = x2;
+	anim.y2 = y2;
+	anim.width = w;
+	anim.height = h;
+	anim.specialSize = specialSize;
+	anim.shapeIndex = shape;
+	if (filename)
+		strcpy(anim.filename, filename);
+
+	if (flags & 8) {
+		_sceneAnimMovie[animId]->open(filename, 1, 0);
+		musicUpdate(0);
+		if (_sceneAnimMovie[animId]->opened()) {
+			anim.wsaFlag = 1;
+			if (x2 == -1)
+				x2 = _sceneAnimMovie[animId]->xAdd();
+			if (y2 == -1)
+				y2 = _sceneAnimMovie[animId]->yAdd();
+			if (w == -1)
+				w = _sceneAnimMovie[animId]->width();
+			if (h == -1)
+				h = _sceneAnimMovie[animId]->height();
+			if (x == -1)
+				x = (w >> 1) + x2;
+			if (y == -1)
+				y = y2 + h - 1;
+
+			anim.x = x;
+			anim.y = y;
+			anim.x2 = x2;
+			anim.y2 = y2;
+			anim.width = w;
+			anim.height = h;
+		}
+	}
+
+	AnimObj *obj = &_animObjects[1+animId];
+	obj->enabled = true;
+	obj->needRefresh = true;
+
+	obj->specialRefresh = (anim.flags & 0x20) ? 1 : 0;
+	obj->flags = (anim.flags & 0x10) ? 0x800 : 0;
+	if (anim.flags & 2)
+		obj->flags |= 1;
+
+	obj->xPos1 = anim.x;
+	obj->yPos1 = anim.y;
+
+	if ((anim.flags & 4) && anim.shapeIndex != -1)
+		obj->shapePtr = _sceneShapes[anim.shapeIndex];
+	else
+		obj->shapePtr = 0;
+
+	if (anim.flags & 8) {
+		obj->shapeIndex3 = anim.shapeIndex;
+		obj->animNum = animId;
+	} else {
+		obj->shapeIndex3 = 0xFFFF;
+		obj->animNum = 0xFFFF;
+	}
+
+	obj->xPos3 = obj->xPos2 = anim.x2;
+	obj->yPos3 = obj->yPos2 = anim.y2;
+	obj->width = anim.width;
+	obj->height = anim.height;
+	obj->width2 = obj->height2 = anim.specialSize;
+
+	if (_animList)
+		_animList = addToAnimListSorted(_animList, obj);
+	else
+		_animList = initAnimList(_animList, obj);
+}
+
+void KyraEngine_MR::removeSceneAnimObject(int anim, int refresh) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::removeSceneAnimObject(%d, %d)", anim, refresh);
+	AnimObj *obj = &_animObjects[anim+1];
+	restorePage3();
+	obj->shapeIndex3 = 0xFFFF;
+	obj->animNum = 0xFFFF;
+	obj->needRefresh = true;
+
+	if (refresh)
+		refreshAnimObjectsIfNeed();
+
+	obj->enabled = false;
+	_animList = deleteAnimListEntry(_animList, obj);
+	_sceneAnimMovie[anim]->close();
+}
+
+void KyraEngine_MR::setCharacterAnimDim(int w, int h) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::setCharacterAnimDim(%d, %d)", w, h);
+	restorePage3();
+	_charBackUpWidth = _animObjects[0].width;
+	_charBackUpWidth2 = _animObjects[0].width2;
+	_charBackUpHeight = _animObjects[0].height;
+	_charBackUpHeight2 = _animObjects[0].height2;
+	
+	_animObjects[0].width2 = (w - _charBackUpWidth) / 2;
+	_animObjects[0].height2 = h - _charBackUpHeight;
+	_animObjects[0].width = w;
+	_animObjects[0].height = h;
+}
+
+void KyraEngine_MR::resetCharacterAnimDim() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::resetCharacterAnimDim()");
+	restorePage3();
+	_animObjects[0].width2 = _charBackUpWidth2;
+	_animObjects[0].height2 = _charBackUpHeight2;
+	_animObjects[0].width = _charBackUpWidth;
+	_animObjects[0].height = _charBackUpHeight;
+	_charBackUpWidth2 = _charBackUpHeight2 = -1;
+	_charBackUpWidth = _charBackUpHeight = -1;
+}
+
+void KyraEngine_MR::showIdleAnim() {
+	debugC(9, kDebugLevelMain | kDebugLevelAnimator, "KyraEngine_MR::showIdleAnim()");
+
+	if (_mainCharacter.sceneId == 20 || _mainCharacter.sceneId == 21
+			|| _mainCharacter.sceneId == 12 || _mainCharacter.sceneId == 11)
+		return;
+
+	if (_mainCharacter.animFrame == 87)
+		return;
+
+	if (!_nextIdleType && !talkObjectsInCurScene()) {
+		malcolmRandomChat();
+	} else {
+		static const char *facingTable[] = {
+			"A", "R", "R", "FR", "FX", "FL", "L", "L"
+		};
+
+		char filename[14];
+		snprintf(filename, 14, "MI0%s%.02d.EMC", facingTable[_mainCharacter.facing], _malcolmShapes);
+
+		if (_res->exists(filename))
+			runTemporaryScript(filename, 1, 1, 1, 1);
+	}
+
+	_nextIdleType = !_nextIdleType;
+}
+
+void KyraEngine_MR::addItemToAnimList(int item) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::addItemToAnimList(%d)", item);
+	restorePage3();
+
+	AnimObj *animObj = &_animObjects[17+item];
+
+	animObj->enabled = 1;
+	animObj->needRefresh = 1;
+
+	int itemId = _itemList[item].id;
+
+	animObj->xPos2 = animObj->xPos1 = _itemList[item].x;
+	animObj->yPos2 = animObj->yPos1 = _itemList[item].y;
+
+	animObj->shapePtr = getShapePtr(248+itemId);
+	animSetupPaletteEntry(animObj);
+	animObj->shapeIndex2 = animObj->shapeIndex1 = 248+itemId;
+
+	int scaleY, scaleX;
+	scaleY = scaleX = getScale(animObj->xPos1, animObj->yPos1);
+
+	uint8 *shapePtr = getShapePtr(248+itemId);
+	animObj->xPos3 = (animObj->xPos2 -= (_screen->getShapeScaledWidth(shapePtr, scaleX) >> 1));
+	animObj->yPos3 = (animObj->yPos2 -= _screen->getShapeScaledHeight(shapePtr, scaleY));
+
+	animObj->width2 = animObj->height2 = 0;
+
+	_animList = addToAnimListSorted(_animList, animObj);
+	animObj->needRefresh = 1;
+}
+
+void KyraEngine_MR::deleteItemAnimEntry(int item) {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_MR::deleteItemAnimEntry(%d)", item);
+	AnimObj *animObj = &_animObjects[17+item];
+
+	restorePage3();
+
+	animObj->shapePtr = 0;
+	animObj->shapeIndex1 = 0xFFFF;
+	animObj->shapeIndex2 = 0xFFFF;
+	animObj->needRefresh = 1;
+
+	refreshAnimObjectsIfNeed();
+
+	animObj->enabled = 0;
+	_animList = deleteAnimListEntry(_animList, animObj);
+}
+
+} // end of namespace Kyra
+

Deleted: scummvm/trunk/engines/kyra/animator_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator_v2.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/animator_v2.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -1,490 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "kyra/kyra_v2.h"
-#include "kyra/wsamovie.h"
-
-#include "common/endian.h"
-
-namespace Kyra {
-
-void KyraEngine_v2::clearAnimObjects() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::clearAnimObjects()");
-	memset(_animObjects, 0, sizeof(_animObjects));
-
-	_animObjects[0].index = 0;
-	_animObjects[0].type = 0;
-	_animObjects[0].enabled = 1;
-	_animObjects[0].flags = 0x800;
-	_animObjects[0].width = 32;
-	_animObjects[0].height = 49;
-	_animObjects[0].width2 = 4;
-	_animObjects[0].height2 = 10;
-
-	for (int i = 1; i < 11; ++i) {
-		_animObjects[i].index = i;
-		_animObjects[i].type = 2;
-	}
-
-	for (int i = 11; i <= 40; ++i) {
-		_animObjects[i].index = i;
-		_animObjects[i].type = 1;
-		_animObjects[i].flags = 0x800;
-		_animObjects[i].width = 16;
-		_animObjects[i].height = 16;
-	}
-}
-
-KyraEngine_v2::AnimObj *KyraEngine_v2::initAnimList(AnimObj *list, AnimObj *entry) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::initAnimList(%p, %p)", (const void*)list, (const void*)entry);
-	entry->nextObject = list;
-	return entry;
-}
-
-KyraEngine_v2::AnimObj *KyraEngine_v2::addToAnimListSorted(AnimObj *list, AnimObj *add) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::addToAnimListSorted(%p, %p)", (const void*)list, (const void*)add);
-	add->nextObject = 0;
-
-	if (!list)
-		return add;
-
-	if (add->yPos1 <= list->yPos1) {
-		add->nextObject = list;
-		return add;
-	}
-
-	AnimObj *cur = list;
-	AnimObj *prev = list;
-	while (add->yPos1 > cur->yPos1) {
-		AnimObj *temp = cur->nextObject;
-		if (!temp)
-			break;
-		prev = cur;
-		cur = temp;
-	}
-
-	if (add->yPos1 <= cur->yPos1) {
-		prev->nextObject = add;
-		add->nextObject = cur;
-	} else {
-		cur->nextObject = add;
-		add->nextObject = 0;
-	}
-	return list;
-}
-
-KyraEngine_v2::AnimObj *KyraEngine_v2::deleteAnimListEntry(AnimObj *list, AnimObj *entry) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::addToAnimListSorted(%p, %p)", (const void*)list, (const void*)entry);
-	if (!list)
-		return 0;
-
-	AnimObj *old = 0;
-	AnimObj *cur = list;
-
-	while (true) {
-		if (cur == entry)
-			break;
-		if (!cur->nextObject)
-			break;
-		old = cur;
-		cur = cur->nextObject;
-	}
-
-	if (cur != entry)
-		return list;
-
-	if (cur == list) {
-		if (!cur->nextObject)
-			return 0;
-		cur = cur->nextObject;
-		return cur;
-	}
-
-	if (!cur->nextObject) {
-		if (!old)
-			return 0;
-		old->nextObject = 0;
-		return list;
-	}
-
-	if (cur != entry)
-		return list;
-
-	old->nextObject = entry->nextObject;
-	return list;
-}
-
-void KyraEngine_v2::drawAnimObjects() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::drawAnimObjects()");
-	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
-		if (!curObject->enabled)
-			continue;
-
-		int x = curObject->xPos2 - (_screen->getScreenDim(2)->sx << 3);
-		int y = curObject->yPos2 - _screen->getScreenDim(2)->sy;
-		int layer = 7;
-
-		if (curObject->flags & 0x800) {
-			if (curObject->animFlags)
-				layer = 0;
-			else
-				layer = getDrawLayer(curObject->xPos1, curObject->yPos1);
-		}
-		curObject->flags |= 0x800;
-
-		if (curObject->index)
-			drawSceneAnimObject(curObject, x, y, layer);
-		else
-			drawCharacterAnimObject(curObject, x, y, layer);
-	}
-}
-
-void KyraEngine_v2::refreshAnimObjects(int force) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::refreshAnimObjects(%d)", force);
-	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
-		if (!curObject->enabled)
-			continue;
-		if (!curObject->needRefresh && !force)
-			continue;
-
-		int x = curObject->xPos2 - curObject->width2;
-		if (x < 0)
-			x = 0;
-		if (x >= 320)
-			x = 319;
-		int y = curObject->yPos2 - curObject->height2;
-		if (y < 0)
-			y = 0;
-		if (y >= 143)
-			y = 142;
-
-		int width = curObject->width + curObject->width2 + 8;
-		int height = curObject->height + curObject->height2*2;
-		if (width + x > 320)
-			width -= width + x - 322;
-		if (height + y > 143)
-			height -= height + y - 144;
-
-		_screen->hideMouse();
-		_screen->copyRegion(x, y, x, y, width, height, 2, 0, Screen::CR_NO_P_CHECK);
-		_screen->showMouse();
-
-		curObject->needRefresh = false;
-	}
-}
-
-void KyraEngine_v2::refreshAnimObjectsIfNeed() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::refreshAnimObjectsIfNeed()");
-	for (AnimObj *curEntry = _animList; curEntry; curEntry = curEntry->nextObject) {
-		if (curEntry->enabled && curEntry->needRefresh) {
-			restorePage3();
-			drawAnimObjects();
-			refreshAnimObjects(0);
-			_screen->updateScreen();
-			return;
-		}
-	}
-}
-
-void KyraEngine_v2::updateItemAnimations() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::updateItemAnimations()");
-	bool nextFrame = false;
-
-	if (_itemAnimData[0].itemIndex == -1 || _inventorySaved)
-		return;	
-
-	const ItemAnimData_v2 *s = &_itemAnimData[_nextAnimItem];
-	ActiveItemAnim *a = &_activeItemAnim[_nextAnimItem];
-	
-	if (++_nextAnimItem == 14) {
-		_nextAnimItem = 0;
-		return;
-	}
-
-	uint32 ctime = _system->getMillis();
-	if (ctime < a->nextFrame)
-		return;
-
-	uint16 shpIdx = s->frames[a->currentFrame].index + 64;
-	if ((s->itemIndex == _handItemSet || s->itemIndex == _itemInHand) && (!_mouseState && _screen->isMouseVisible())) {
-		nextFrame = true;
-		_screen->setMouseCursor(8, 15, getShapePtr(shpIdx));
-	}
-
-	for (int i = 0; i < 10; i++) {
-		if (s->itemIndex == _mainCharacter.inventory[i]) {
-			nextFrame = true;
-			_screen->drawShape(2, _defaultShapeTable[240 + i], 304, 184, 0, 0);
-			_screen->drawShape(2, getShapePtr(shpIdx), 304, 184, 0, 0);
-			_screen->copyRegion(304, 184, _inventoryX[i], _inventoryY[i], 16, 16, 2, 0);
-		}
-	}
-
-	_screen->updateScreen();
-
-	for (int i = 11; i < 40; i++) {
-		AnimObj *animObject = &_animObjects[i];
-		if (animObject->shapeIndex2 == s->itemIndex + 64) {
-			if (s->itemIndex == 121) {
-				int f = findItem(_mainCharacter.sceneId, 121);
-				int nx = _itemList[f].x - 4;
-				if (nx > 12) {
-					if (lineIsPassable(nx, _itemList[f].y)) {
-						animObject->xPos2 -= 4;
-						_itemList[f].x -= 4;
-					}
-				}
-			}
-			animObject->shapePtr = _defaultShapeTable[shpIdx];
-			animObject->shapeIndex1 = shpIdx;
-			animObject->needRefresh = 1;
-			nextFrame = true;
-		}
-	}
-
-	if (nextFrame) {
-		a->nextFrame = _system->getMillis() + (s->frames[a->currentFrame].delay * _tickLength);
-		a->currentFrame = ++a->currentFrame % s->numFrames;
-	}
-}
-
-void KyraEngine_v2::flagAnimObjsForRefresh() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::flagAnimObjsForRefresh()");
-	for (AnimObj *curEntry = _animList; curEntry; curEntry = curEntry->nextObject)
-		curEntry->needRefresh = 1;
-}
-
-void KyraEngine_v2::flagAnimObjsUnk8() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::flagAnimObjsUnk8()");
-	for (AnimObj *curEntry = _animList; curEntry; curEntry = curEntry->nextObject)
-		curEntry->unk8 = 1;
-}
-
-void KyraEngine_v2::updateCharFacing() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::updateCharFacing()");
-	if (_mainCharacter.x1 > _mouseX)
-		_mainCharacter.facing = 5;
-	else
-		_mainCharacter.facing = 3;
-
-	_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
-	updateCharacterAnim(0);
-	refreshAnimObjectsIfNeed();
-}
-
-void KyraEngine_v2::updateCharacterAnim(int) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::updateCharacterAnim(-)");
-	Character *c = &_mainCharacter;
-	AnimObj *animState = _animObjects;
-
-	animState->needRefresh = 1;
-	animState->unk8 = 1;
-
-	if (c->facing >= 1 && c->facing <= 3)
-		animState->flags |= 1;
-	else if (c->facing >= 5 && c->facing <= 7)
-		animState->flags &= ~1;
-
-	animState->xPos2 = animState->xPos1 = c->x1;
-	animState->yPos2 = animState->yPos1 = c->y1;
-	animState->shapePtr = _defaultShapeTable[c->animFrame];
-	animState->shapeIndex1 = animState->shapeIndex2 = c->animFrame;
-
-	int xAdd = _shapeDescTable[c->animFrame-9].xAdd;
-	int yAdd = _shapeDescTable[c->animFrame-9].yAdd;
-
-	_charScaleX = _charScaleY = getScale(c->x1, c->y1);
-
-	animState->xPos2 += (xAdd * _charScaleX) >> 8;
-	animState->yPos2 += (yAdd * _charScaleY) >> 8;
-	animState->width2 = 8;
-	animState->height2 = 10;
-
-	_animList = deleteAnimListEntry(_animList, animState);
-	if (_animList)
-		_animList = addToAnimListSorted(_animList, animState);
-	else
-		_animList = initAnimList(_animList, animState);
-
-	updateCharPal(1);
-}
-
-void KyraEngine_v2::updateSceneAnim(int anim, int newFrame) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::updateSceneAnim(%d, %d)", anim, newFrame);
-	AnimObj *animObject = &_animObjects[1+anim];
-	if (!animObject->enabled)
-		return;
-
-	animObject->needRefresh = 1;
-	animObject->unk8 = 1;
-	animObject->flags = 0;
-
-	if (_sceneAnims[anim].flags & 2)
-		animObject->flags |= 0x800;
-	else
-		animObject->flags &= ~0x800;
-
-	if (_sceneAnims[anim].flags & 4)
-		animObject->flags |= 1;
-	else
-		animObject->flags &= ~1;
-
-	if (_sceneAnims[anim].flags & 0x20) {
-		animObject->shapePtr = _sceneShapeTable[newFrame];
-		animObject->shapeIndex2 = 0xFFFF;
-		animObject->shapeIndex3 = 0xFFFF;
-		animObject->animNum = 0xFFFF;
-	} else {
-		animObject->shapePtr = 0;
-		animObject->shapeIndex3 = newFrame;
-		animObject->animNum = anim;
-	}
-
-	animObject->xPos1 = _sceneAnims[anim].x;
-	animObject->yPos1 = _sceneAnims[anim].y;
-	animObject->xPos2 = _sceneAnims[anim].x2;
-	animObject->yPos2 = _sceneAnims[anim].y2;
-
-	if (_sceneAnims[anim].flags & 2) {
-		_animList = deleteAnimListEntry(_animList, animObject);
-		if (!_animList)
-			_animList = initAnimList(_animList, animObject);
-		else
-			_animList = addToAnimListSorted(_animList, animObject);
-	}
-}
-
-void KyraEngine_v2::drawSceneAnimObject(AnimObj *obj, int x, int y, int layer) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::drawSceneAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
-	if (obj->type == 1) {
-		if (obj->shapeIndex1 == 0xFFFF)
-			return;
-		int scale = getScale(obj->xPos1, obj->yPos1);
-		_screen->drawShape(2, getShapePtr(obj->shapeIndex1), x, y, 2, obj->flags | 4, layer, scale, scale);
-		return;
-	}
-
-	if (obj->shapePtr) {
-		_screen->drawShape(2, obj->shapePtr, x, y, 2, obj->flags, layer);
-	} else {
-		if (obj->shapeIndex3 == 0xFFFF || obj->animNum == 0xFFFF)
-			return;
-
-		int flags = 0x4000;
-		if (obj->flags & 0x800)
-			flags |= 0x8000;
-
-		if (_sceneAnims[obj->animNum].wsaFlag) {
-			x = y = 0;
-		} else {
-			x = obj->xPos2;
-			y = obj->yPos2;
-		}
-
-		_sceneAnimMovie[obj->animNum]->setX(x);
-		_sceneAnimMovie[obj->animNum]->setY(y);
-		_sceneAnimMovie[obj->animNum]->setDrawPage(2);
-		_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, int(flags | layer), 0, 0);
-	}
-}
-
-void KyraEngine_v2::drawCharacterAnimObject(AnimObj *obj, int x, int y, int layer) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::drawCharacterAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
-	if (_drawNoShapeFlag || obj->shapeIndex1 == 0xFFFF)
-		return;
-	_screen->drawShape(2, getShapePtr(obj->shapeIndex1), x, y, 2, obj->flags | 4, layer, _charScaleX, _charScaleY);
-}
-
-void KyraEngine_v2::addItemToAnimList(int item) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::addItemToAnimList(%d)", item);
-	restorePage3();
-
-	AnimObj *animObj = &_animObjects[11+item];
-
-	animObj->enabled = 1;
-	animObj->needRefresh = 1;
-	animObj->unk8 = 1;
-
-	int itemId = _itemList[item].id;
-
-	animObj->xPos2 = animObj->xPos1 = _itemList[item].x;
-	animObj->yPos2 = animObj->yPos1 = _itemList[item].y;
-
-	animObj->shapePtr = _defaultShapeTable[64+itemId];
-	animObj->shapeIndex2 = animObj->shapeIndex1 = 64+itemId;
-
-	int scaleY, scaleX;
-	scaleY = scaleX = getScale(animObj->xPos1, animObj->yPos1);
-
-	uint8 *shapePtr = getShapePtr(64+itemId);
-	animObj->xPos3 = (animObj->xPos2 -= (_screen->getShapeScaledWidth(shapePtr, scaleX) >> 1));
-	animObj->yPos3 = (animObj->yPos2 -= _screen->getShapeScaledHeight(shapePtr, scaleY));
-
-	animObj->width2 = animObj->height2 = 0;
-
-	_animList = addToAnimListSorted(_animList, animObj);
-	animObj->needRefresh = 1;
-	animObj->unk8 = 1;
-}
-
-void KyraEngine_v2::deleteItemAnimEntry(int item) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::deleteItemAnimEntry(%d)", item);
-	AnimObj *animObj = &_animObjects[11+item];
-
-	restorePage3();
-
-	animObj->shapePtr = 0;
-	animObj->shapeIndex1 = 0xFFFF;
-	animObj->shapeIndex2 = 0xFFFF;
-	animObj->needRefresh = 1;
-	animObj->unk8 = 1;
-
-	refreshAnimObjectsIfNeed();
-
-	animObj->enabled = 0;
-	_animList = deleteAnimListEntry(_animList, animObj);
-}
-
-void KyraEngine_v2::setCharacterAnimDim(int w, int h) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::setCharacterAnimDim(%d, %d)", w, h);
-	restorePage3();
-
-	_animObj0Width = _animObjects[0].width;
-	_animObj0Height = _animObjects[0].height;
-
-	_animObjects[0].width = w;
-	_animObjects[0].height = h;
-}
-
-void KyraEngine_v2::resetCharacterAnimDim() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v2::resetCharacterAnimDim()");
-	restorePage3();
-
-	_animObjects[0].width = _animObj0Width;
-	_animObjects[0].height = _animObj0Height;
-}
-
-} // end of namespace Kyra
-

Deleted: scummvm/trunk/engines/kyra/animator_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator_v3.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/animator_v3.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -1,584 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "kyra/kyra_v3.h"
-#include "kyra/wsamovie.h"
-
-namespace Kyra {
-
-void KyraEngine_v3::clearAnimObjects() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::clearAnimObjects()");
-
-	for (int i = 0; i < 67; ++i)
-		_animObjects[i].enabled = false;
-
-	_animObjects[0].index = 0;
-	_animObjects[0].type = 0;
-	_animObjects[0].enabled = true;
-	_animObjects[0].unk8 = 1;
-	_animObjects[0].flags = 0x800;
-	_animObjects[0].width = 57;
-	_animObjects[0].height = 91;
-	_animObjects[0].width2 = 4;
-	_animObjects[0].height2 = 10;
-
-	for (int i = 1; i < 17; ++i) {
-		_animObjects[i].index = i;
-		_animObjects[i].type = 2;
-		_animObjects[i].flags = 0;
-		_animObjects[i].enabled = false;
-		_animObjects[i].needRefresh = 0;
-		_animObjects[i].unk8 = 1;
-	}
-
-	for (int i = 17; i <= 66; ++i) {
-		_animObjects[i].index = i;
-		_animObjects[i].type = 1;
-		_animObjects[i].unk8 = 1;
-		_animObjects[i].flags = 0x800;
-		_animObjects[i].width = 24;
-		_animObjects[i].height = 20;
-		_animObjects[i].width2 = 0;
-		_animObjects[i].height2 = 0;
-	}
-}
-
-KyraEngine_v3::AnimObj *KyraEngine_v3::initAnimList(AnimObj *list, AnimObj *entry) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::initAnimList(%p, %p)", (const void*)list, (const void*)entry);
-	entry->nextObject = list;
-	return entry;
-}
-
-KyraEngine_v3::AnimObj *KyraEngine_v3::addToAnimListSorted(AnimObj *list, AnimObj *add) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::addToAnimListSorted(%p, %p)", (const void*)list, (const void*)add);
-	add->nextObject = 0;
-
-	if (!list)
-		return add;
-
-	if (add->yPos1 <= list->yPos1) {
-		add->nextObject = list;
-		return add;
-	}
-
-	AnimObj *cur = list;
-	AnimObj *prev = list;
-	while (add->yPos1 > cur->yPos1) {
-		AnimObj *temp = cur->nextObject;
-		if (!temp)
-			break;
-		prev = cur;
-		cur = temp;
-	}
-
-	if (add->yPos1 <= cur->yPos1) {
-		prev->nextObject = add;
-		add->nextObject = cur;
-	} else {
-		cur->nextObject = add;
-		add->nextObject = 0;
-	}
-	return list;
-}
-
-KyraEngine_v3::AnimObj *KyraEngine_v3::deleteAnimListEntry(AnimObj *list, AnimObj *entry) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::addToAnimListSorted(%p, %p)", (const void*)list, (const void*)entry);
-	if (!list)
-		return 0;
-
-	AnimObj *old = 0;
-	AnimObj *cur = list;
-
-	while (true) {
-		if (cur == entry)
-			break;
-		if (!cur->nextObject)
-			break;
-		old = cur;
-		cur = cur->nextObject;
-	}
-
-	if (cur != entry)
-		return list;
-
-	if (cur == list) {
-		if (!cur->nextObject)
-			return 0;
-		cur = cur->nextObject;
-		return cur;
-	}
-
-	if (!cur->nextObject) {
-		if (!old)
-			return 0;
-		old->nextObject = 0;
-		return list;
-	}
-
-	if (cur != entry)
-		return list;
-
-	old->nextObject = entry->nextObject;
-	return list;
-}
-
-void KyraEngine_v3::animSetupPaletteEntry(AnimObj *anim) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::animSetupPaletteEntry(%p)", (const void*)anim);
-	int layer = _screen->getLayer(anim->xPos1, anim->yPos1) - 1;
-	int16 count = 0;
-	for (int i = 0; i < 3; ++i)
-		count += _sceneDatPalette[layer*3+i];
-	count /= 3;
-	count *= -1;
-	count = MAX<int16>(0, MIN<int16>(count, 10));
-	anim->palette = count / 3;
-}
-
-void KyraEngine_v3::restorePage3() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::restorePage3()");
-	musicUpdate(0);
-	_screen->copyBlockToPage(3, 0, 0, 320, 200, _gamePlayBuffer);
-	musicUpdate(0);
-}
-
-void KyraEngine_v3::drawAnimObjects() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::drawAnimObjects()");
-	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
-		if (!curObject->enabled)
-			continue;
-
-		int x = curObject->xPos2 - (_screen->getScreenDim(2)->sx << 3);
-		int y = curObject->yPos2 - _screen->getScreenDim(2)->sy;
-		int layer = 7;
-
-		if (curObject->flags & 0x800) {
-			if (!curObject->unk8)
-				layer = 0;
-			else
-				layer = getDrawLayer(curObject->xPos1, curObject->yPos1);
-		}
-
-		if (curObject->index)
-			drawSceneAnimObject(curObject, x, y, layer);
-		else
-			drawCharacterAnimObject(curObject, x, y, layer);
-	}
-}
-
-void KyraEngine_v3::drawSceneAnimObject(AnimObj *obj, int x, int y, int layer) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::drawSceneAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
-	if (obj->type == 1) {
-		if (obj->shapeIndex == 0xFFFF)
-			return;
-		int scale = getScale(obj->xPos1, obj->yPos1);
-		_screen->drawShape(2, getShapePtr(obj->shapeIndex), x, y, 2, obj->flags | 0x104, _paletteOverlay, obj->palette, layer, scale, scale);
-	} else {
-		if (obj->shapePtr) {
-			_screen->drawShape(2, obj->shapePtr, x, y, 2, obj->flags, 7);
-		} else {
-			if (obj->shapeIndex3 == 0xFFFF || obj->animNum == 0xFFFF)
-				return;
-			uint16 flags = 0x4000;
-			if (obj->flags & 0x800)
-				flags |= 0x8000;
-			x = obj->xPos2 - _sceneAnimMovie[obj->animNum]->xAdd();
-			y = obj->yPos2 - _sceneAnimMovie[obj->animNum]->yAdd();
-			_sceneAnimMovie[obj->animNum]->setDrawPage(2);
-			_sceneAnimMovie[obj->animNum]->setX(x);
-			_sceneAnimMovie[obj->animNum]->setY(y);
-			_sceneAnimMovie[obj->animNum]->displayFrame(obj->shapeIndex3, flags | layer);
-		}
-	}
-}
-
-void KyraEngine_v3::drawCharacterAnimObject(AnimObj *obj, int x, int y, int layer) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::drawCharacterAnimObject(%p, %d, %d, %d)", (const void*)obj, x, y, layer);
-	if (_drawNoShapeFlag)
-		return;
-
-	if (_mainCharacter.animFrame < 9)
-		_mainCharacter.animFrame = 87;
-
-	if (obj->shapeIndex == 0xFFFF || _mainCharacter.animFrame == 87)
-		return;
-
-	_screen->drawShape(2, getShapePtr(421), _mainCharacter.x3, _mainCharacter.y3, 2, obj->flags | 0x304, _paletteOverlay, 3, layer, _charScale, _charScale);
-	uint8 *shape = getShapePtr(_mainCharacter.animFrame);
-	if (shape)
-		_screen->drawShape(2, shape, x, y, 2, obj->flags | 4, layer, _charScale, _charScale);
-}
-
-void KyraEngine_v3::refreshAnimObjects(int force) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::refreshAnimObjects(%d)", force);
-	for (AnimObj *curObject = _animList; curObject; curObject = curObject->nextObject) {
-		if (!curObject->enabled)
-			continue;
-		if (!curObject->needRefresh && !force)
-			continue;
-
-		const int scale = (curObject->index == 0) ? _charScale : 0;
-
-		int x = curObject->xPos2 - curObject->width2;
-		if (scale)
-			x -= (0x100 - scale) >> 4;
-
-		if (x < 0)
-			x = 0;
-		if (x >= 320)
-			x = 319;
-
-		int y = curObject->yPos2 - curObject->height2;
-		if (scale)
-			y -= (0x100 - scale) >> 3;
-		if (y < 0)
-			y = 0;
-		if (y >= 187)
-			y = 186;
-
-		int width = curObject->width + curObject->width2 + 8;
-		int height = curObject->height + curObject->height2*2;
-		if (width + x > 320)
-			width -= width + x - 322;
-
-		const int maxY = _inventoryState ? 143 : 187;
-		if (height + y > maxY)
-			height -= height + y - (maxY + 1);
-
-		if (height > 0) {
-			_screen->hideMouse();
-			_screen->copyRegion(x, y, x, y, width, height, 2, 0, Screen::CR_NO_P_CHECK);
-			_screen->showMouse();
-		}
-
-		curObject->needRefresh = false;
-	}
-}
-
-void KyraEngine_v3::refreshAnimObjectsIfNeed() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::refreshAnimObjectsIfNeed()");
-	for (AnimObj *curEntry = _animList; curEntry; curEntry = curEntry->nextObject) {
-		if (curEntry->enabled && curEntry->needRefresh) {
-			restorePage3();
-			drawAnimObjects();
-			refreshAnimObjects(0);
-			_screen->updateScreen();
-			return;
-		}
-	}
-}
-
-void KyraEngine_v3::flagAnimObjsForRefresh() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::flagAnimObjsForRefresh()");
-	for (AnimObj *curEntry = _animList; curEntry; curEntry = curEntry->nextObject)
-		curEntry->needRefresh = true;
-}
-
-void KyraEngine_v3::updateCharacterAnim(int charId) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::updateCharacterAnim(%d)", charId);
-
-	AnimObj *obj = &_animObjects[0];
-	obj->needRefresh = true;
-	obj->flags &= ~1;
-	obj->xPos1 = _mainCharacter.x1;
-	obj->yPos1 = _mainCharacter.y1;
-	obj->shapePtr = getShapePtr(_mainCharacter.animFrame);
-	obj->shapeIndex = obj->shapeIndex2 = _mainCharacter.animFrame;
-
-	int shapeOffsetX = 0, shapeOffsetY = 0;
-	if (_mainCharacter.animFrame >= 50 && _mainCharacter.animFrame <= 87) {
-		shapeOffsetX = _malcolmShapeXOffset;
-		shapeOffsetY = _malcolmShapeYOffset;
-	} else {
-		shapeOffsetX = _newShapeXAdd;
-		shapeOffsetY = _newShapeYAdd;
-	}
-
-	obj->xPos2 = _mainCharacter.x1;
-	obj->yPos2 = _mainCharacter.y1;
-	_charScale = getScale(_mainCharacter.x1, _mainCharacter.y1);
-	obj->xPos2 += (shapeOffsetX * _charScale) >> 8;
-	obj->yPos2 += (shapeOffsetY * _charScale) >> 8;
-	_mainCharacter.x3 = _mainCharacter.x1 - (_charScale >> 4) - 1;
-	_mainCharacter.y3 = _mainCharacter.y1 - (_charScale >> 6) - 1;
-	if (_charBackUpWidth2 == -1) {
-		obj->width2 = 4;
-		obj->height2 = 10;
-	}
-
-	for (int i = 1; i <= 16; ++i) {
-		if (_animObjects[i].enabled && _animObjects[i].unk8)
-			_animObjects[i].needRefresh = true;
-	}
-
-	_animList = deleteAnimListEntry(_animList, obj);
-	if (_animList)
-		_animList = addToAnimListSorted(_animList, obj);
-	else
-		_animList = initAnimList(_animList, obj);
-
-	if (!_loadingState)
-		updateCharPal(1);
-}
-
-void KyraEngine_v3::updateSceneAnim(int anim, int newFrame) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::updateSceneAnim(%d, %d)", anim, newFrame);
-	AnimObj *animObject = &_animObjects[1+anim];
-	if (!animObject->enabled)
-		return;
-
-	animObject->needRefresh = true;
-
-	if (_sceneAnims[anim].flags & 2)
-		animObject->flags |= 1;
-	else
-		animObject->flags &= ~1;
-
-	if (_sceneAnims[anim].flags & 4) {
-		animObject->shapePtr = _sceneShapes[newFrame];
-		animObject->shapeIndex2 = 0xFFFF;
-		animObject->shapeIndex3 = 0xFFFF;
-		animObject->animNum = 0xFFFF;
-	} else {
-		animObject->shapePtr = 0;
-		animObject->shapeIndex3 = newFrame;
-		animObject->animNum = anim;
-	}
-
-	animObject->xPos1 = _sceneAnims[anim].x;
-	animObject->yPos1 = _sceneAnims[anim].y;
-	animObject->xPos2 = _sceneAnims[anim].x2;
-	animObject->yPos2 = _sceneAnims[anim].y2;
-
-	if (_sceneAnims[anim].flags & 0x20) {
-		_animList = deleteAnimListEntry(_animList, animObject);
-		if (!_animList)
-			_animList = initAnimList(_animList, animObject);
-		else
-			_animList = addToAnimListSorted(_animList, animObject);
-	}
-}
-
-void KyraEngine_v3::setupSceneAnimObject(int animId, uint16 flags, int x, int y, int x2, int y2, int w,
-										int h, int unk10, int specialSize, int unk14, int shape, const char *filename) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::setupSceneAnimObject(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')",
-			animId, flags, x, y, x2, y2, w, h, unk10, specialSize, unk14, shape, filename);
-	restorePage3();
-	SceneAnim &anim = _sceneAnims[animId];
-	anim.flags = flags;
-	anim.x = x;
-	anim.y = y;
-	anim.x2 = x2;
-	anim.y2 = y2;
-	anim.width = w;
-	anim.height = h;
-	anim.unk10 = unk10;
-	anim.specialSize = specialSize;
-	anim.unk14 = unk14;
-	anim.shapeIndex = shape;
-	if (filename)
-		strcpy(anim.filename, filename);
-
-	if (flags & 8) {
-		_sceneAnimMovie[animId]->open(filename, 1, 0);
-		musicUpdate(0);
-		if (_sceneAnimMovie[animId]->opened()) {
-			anim.wsaFlag = 1;
-			if (x2 == -1)
-				x2 = _sceneAnimMovie[animId]->xAdd();
-			if (y2 == -1)
-				y2 = _sceneAnimMovie[animId]->yAdd();
-			if (w == -1)
-				w = _sceneAnimMovie[animId]->width();
-			if (h == -1)
-				h = _sceneAnimMovie[animId]->height();
-			if (x == -1)
-				x = (w >> 1) + x2;
-			if (y == -1)
-				y = y2 + h - 1;
-
-			anim.x = x;
-			anim.y = y;
-			anim.x2 = x2;
-			anim.y2 = y2;
-			anim.width = w;
-			anim.height = h;
-		}
-	}
-
-	AnimObj *obj = &_animObjects[1+animId];
-	obj->enabled = true;
-	obj->needRefresh = true;
-
-	obj->unk8 = (anim.flags & 0x20) ? 1 : 0;
-	obj->flags = (anim.flags & 0x10) ? 0x800 : 0;
-	if (anim.flags & 2)
-		obj->flags |= 1;
-
-	obj->xPos1 = anim.x;
-	obj->yPos1 = anim.y;
-
-	if ((anim.flags & 4) && anim.shapeIndex != 0xFFFF)
-		obj->shapePtr = _sceneShapes[anim.shapeIndex];
-	else
-		obj->shapePtr = 0;
-
-	if (anim.flags & 8) {
-		obj->shapeIndex3 = anim.shapeIndex;
-		obj->animNum = animId;
-	} else {
-		obj->shapeIndex3 = 0xFFFF;
-		obj->animNum = 0xFFFF;
-	}
-
-	obj->xPos3 = obj->xPos2 = anim.x2;
-	obj->yPos3 = obj->yPos2 = anim.y2;
-	obj->width = anim.width;
-	obj->height = anim.height;
-	obj->width2 = obj->height2 = anim.specialSize;
-
-	if (_animList)
-		_animList = addToAnimListSorted(_animList, obj);
-	else
-		_animList = initAnimList(_animList, obj);
-}
-
-void KyraEngine_v3::removeSceneAnimObject(int anim, int refresh) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::removeSceneAnimObject(%d, %d)", anim, refresh);
-	AnimObj *obj = &_animObjects[anim+1];
-	restorePage3();
-	obj->shapeIndex3 = 0xFFFF;
-	obj->animNum = 0xFFFF;
-	obj->needRefresh = true;
-
-	if (refresh)
-		refreshAnimObjectsIfNeed();
-
-	obj->enabled = false;
-	_animList = deleteAnimListEntry(_animList, obj);
-	_sceneAnimMovie[anim]->close();
-}
-
-void KyraEngine_v3::setCharacterAnimDim(int w, int h) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::setCharacterAnimDim(%d, %d)", w, h);
-	restorePage3();
-	_charBackUpWidth = _animObjects[0].width;
-	_charBackUpWidth2 = _animObjects[0].width2;
-	_charBackUpHeight = _animObjects[0].height;
-	_charBackUpHeight2 = _animObjects[0].height2;
-	
-	_animObjects[0].width2 = (w - _charBackUpWidth) / 2;
-	_animObjects[0].height2 = h - _charBackUpHeight;
-	_animObjects[0].width = w;
-	_animObjects[0].height = h;
-}
-
-void KyraEngine_v3::resetCharacterAnimDim() {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::resetCharacterAnimDim()");
-	restorePage3();
-	_animObjects[0].width2 = _charBackUpWidth2;
-	_animObjects[0].height2 = _charBackUpHeight2;
-	_animObjects[0].width = _charBackUpWidth;
-	_animObjects[0].height = _charBackUpHeight;
-	_charBackUpWidth2 = _charBackUpHeight2 = -1;
-	_charBackUpWidth = _charBackUpHeight = -1;
-}
-
-void KyraEngine_v3::showIdleAnim() {
-	debugC(9, kDebugLevelMain | kDebugLevelAnimator, "KyraEngine_v3::showIdleAnim()");
-
-	if (_mainCharacter.sceneId == 20 || _mainCharacter.sceneId == 21
-			|| _mainCharacter.sceneId == 12 || _mainCharacter.sceneId == 11)
-		return;
-
-	if (_mainCharacter.animFrame == 87)
-		return;
-
-	if (!_nextIdleType && !talkObjectsInCurScene()) {
-		malcolmRandomChat();
-	} else {
-		static const char *facingTable[] = {
-			"A", "R", "R", "FR", "FX", "FL", "L", "L"
-		};
-
-		char filename[14];
-		snprintf(filename, 14, "MI0%s%.02d.EMC", facingTable[_mainCharacter.facing], _malcolmShapes);
-
-		if (_res->exists(filename))
-			runTemporaryScript(filename, 1, 1, 1, 1);
-	}
-
-	_nextIdleType = !_nextIdleType;
-}
-
-void KyraEngine_v3::addItemToAnimList(int item) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::addItemToAnimList(%d)", item);
-	restorePage3();
-
-	AnimObj *animObj = &_animObjects[17+item];
-
-	animObj->enabled = 1;
-	animObj->needRefresh = 1;
-
-	int itemId = _itemList[item].id;
-
-	animObj->xPos2 = animObj->xPos1 = _itemList[item].x;
-	animObj->yPos2 = animObj->yPos1 = _itemList[item].y;
-
-	animObj->shapePtr = getShapePtr(248+itemId);
-	animSetupPaletteEntry(animObj);
-	animObj->shapeIndex2 = animObj->shapeIndex = 248+itemId;
-
-	int scaleY, scaleX;
-	scaleY = scaleX = getScale(animObj->xPos1, animObj->yPos1);
-
-	uint8 *shapePtr = getShapePtr(248+itemId);
-	animObj->xPos3 = (animObj->xPos2 -= (_screen->getShapeScaledWidth(shapePtr, scaleX) >> 1));
-	animObj->yPos3 = (animObj->yPos2 -= _screen->getShapeScaledHeight(shapePtr, scaleY));
-
-	animObj->width2 = animObj->height2 = 0;
-
-	_animList = addToAnimListSorted(_animList, animObj);
-	animObj->needRefresh = 1;
-}
-
-void KyraEngine_v3::deleteItemAnimEntry(int item) {
-	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::deleteItemAnimEntry(%d)", item);
-	AnimObj *animObj = &_animObjects[17+item];
-
-	restorePage3();
-
-	animObj->shapePtr = 0;
-	animObj->shapeIndex = 0xFFFF;
-	animObj->shapeIndex2 = 0xFFFF;
-	animObj->needRefresh = 1;
-
-	refreshAnimObjectsIfNeed();
-
-	animObj->enabled = 0;
-	_animList = deleteAnimListEntry(_animList, animObj);
-}
-
-} // end of namespace Kyra
-

Modified: scummvm/trunk/engines/kyra/debugger.cpp
===================================================================
--- scummvm/trunk/engines/kyra/debugger.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/debugger.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -28,8 +28,8 @@
 #include "common/system.h"
 #include "kyra/debugger.h"
 #include "kyra/kyra_v1.h"
-#include "kyra/kyra_v2.h"
-#include "kyra/kyra_v3.h"
+#include "kyra/kyra_hof.h"
+#include "kyra/kyra_mr.h"
 #include "kyra/screen.h"
 #include "kyra/timer.h"
 #include "kyra/resource.h"
@@ -283,7 +283,7 @@
 
 #pragma mark -
 
-Debugger_v2::Debugger_v2(KyraEngine_v2 *vm) : Debugger(vm), _vm(vm) {
+Debugger_v2::Debugger_v2(KyraEngine_HoF *vm) : Debugger(vm), _vm(vm) {
 	DCmd_Register("character_info",		WRAP_METHOD(Debugger_v2, cmd_characterInfo));
 	DCmd_Register("enter",				WRAP_METHOD(Debugger_v2, cmd_enterScene));
 	DCmd_Register("rooms",				WRAP_METHOD(Debugger_v2, cmd_listScenes));	// for consistency with kyra_v1
@@ -322,7 +322,8 @@
 		_vm->_mainCharacter.facing = direction;
 
 		_vm->enterNewScene(scene, _vm->_mainCharacter.facing, 0, 0, 1);
-		_vm->_screen->_mouseLockCount = 0;
+		while (!_vm->_screen->isMouseVisible())
+			_vm->_screen->showMouse();
 
 		_detach_now = true;
 		return false;
@@ -335,8 +336,8 @@
 bool Debugger_v2::cmd_listScenes(int argc, const char **argv) {
 	int shown = 1;
 	for (int i = 0; i < _vm->_sceneListSize; ++i) {
-		if (_vm->_sceneList[i].filename[0]) {
-			DebugPrintf("%-2i: %-10s", i, _vm->_sceneList[i].filename);
+		if (_vm->_sceneList[i].filename1[0]) {
+			DebugPrintf("%-2i: %-10s", i, _vm->_sceneList[i].filename1);
 			if (!(shown % 5))
 				DebugPrintf("\n");
 			++shown;
@@ -348,7 +349,7 @@
 }
 
 bool Debugger_v2::cmd_sceneInfo(int argc, const char **argv) {
-	DebugPrintf("Current scene: %d '%s'\n", _vm->_currentScene, _vm->_sceneList[_vm->_currentScene].filename);
+	DebugPrintf("Current scene: %d '%s'\n", _vm->_currentScene, _vm->_sceneList[_vm->_currentScene].filename1);
 	DebugPrintf("\n");
 	DebugPrintf("Exit information:\n");
 	DebugPrintf("Exit1: leads to %d, position %dx%d\n", int16(_vm->_sceneExit1), _vm->_sceneEnterX1, _vm->_sceneEnterY1);
@@ -371,7 +372,7 @@
 }
 
 bool Debugger_v2::cmd_characterInfo(int argc, const char **argv) {
-	DebugPrintf("Main character is in scene: %d '%s'\n", _vm->_mainCharacter.sceneId, _vm->_sceneList[_vm->_mainCharacter.sceneId].filename);
+	DebugPrintf("Main character is in scene: %d '%s'\n", _vm->_mainCharacter.sceneId, _vm->_sceneList[_vm->_mainCharacter.sceneId].filename1);
 	DebugPrintf("Position: %dx%d\n", _vm->_mainCharacter.x1, _vm->_mainCharacter.y1);
 	DebugPrintf("Facing: %d\n", _vm->_mainCharacter.facing);
 	DebugPrintf("Inventory:\n");
@@ -452,7 +453,7 @@
 	return true;
 }
 
-Debugger_v3::Debugger_v3(KyraEngine_v3 *vm) : Debugger(vm), _vm(vm) {
+Debugger_v3::Debugger_v3(KyraEngine_MR *vm) : Debugger(vm), _vm(vm) {
 	DCmd_Register("give",				WRAP_METHOD(Debugger_v3, cmd_giveItem));
 	DCmd_Register("enter",				WRAP_METHOD(Debugger_v3, cmd_enterScene));
 	DCmd_Register("rooms",				WRAP_METHOD(Debugger_v3, cmd_listScenes));	// for consistency with kyra_v1

Modified: scummvm/trunk/engines/kyra/debugger.h
===================================================================
--- scummvm/trunk/engines/kyra/debugger.h	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/debugger.h	2008-05-02 14:46:30 UTC (rev 31817)
@@ -32,8 +32,8 @@
 
 class KyraEngine;
 class KyraEngine_v1;
-class KyraEngine_v2;
-class KyraEngine_v3;
+class KyraEngine_HoF;
+class KyraEngine_MR;
 
 class Debugger : public ::GUI::Debugger {
 public:
@@ -73,11 +73,11 @@
 
 class Debugger_v2 : public Debugger {
 public:
-	Debugger_v2(KyraEngine_v2 *vm);
+	Debugger_v2(KyraEngine_HoF *vm);
 	virtual ~Debugger_v2() {}
 
 protected:
-	KyraEngine_v2 *_vm;
+	KyraEngine_HoF *_vm;
 
 	bool cmd_enterScene(int argc, const char **argv);
 	bool cmd_listScenes(int argc, const char **argv);
@@ -90,11 +90,11 @@
 
 class Debugger_v3 : public Debugger {
 public:
-	Debugger_v3(KyraEngine_v3 *vm);
+	Debugger_v3(KyraEngine_MR *vm);
 	virtual ~Debugger_v3() {}
 
 protected:
-	KyraEngine_v3 *_vm;
+	KyraEngine_MR *_vm;
 	
 	bool cmd_giveItem(int argc, const char **argv);	
 	bool cmd_enterScene(int argc, const char **argv);

Modified: scummvm/trunk/engines/kyra/detection.cpp
===================================================================
--- scummvm/trunk/engines/kyra/detection.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/detection.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -24,8 +24,8 @@
 
 #include "kyra/kyra.h"
 #include "kyra/kyra_v1.h"
-#include "kyra/kyra_v2.h"
-#include "kyra/kyra_v3.h"
+#include "kyra/kyra_hof.h"
+#include "kyra/kyra_mr.h"
 
 #include "common/config-manager.h"
 #include "common/advancedDetector.h"
@@ -509,10 +509,10 @@
 		*engine = new Kyra::KyraEngine_v1(syst, flags);
 		break;
 	case Kyra::GI_KYRA2:
-		*engine = new Kyra::KyraEngine_v2(syst, flags);
+		*engine = new Kyra::KyraEngine_HoF(syst, flags);
 		break;
 	case Kyra::GI_KYRA3:
-		*engine = new Kyra::KyraEngine_v3(syst, flags);
+		*engine = new Kyra::KyraEngine_MR(syst, flags);
 		break;
 	default:
 		res = false;

Modified: scummvm/trunk/engines/kyra/gui_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/gui_v2.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -24,17 +24,18 @@
  */
 
 #include "kyra/kyra.h"
-#include "kyra/kyra_v2.h"
+#include "kyra/kyra_hof.h"
 #include "kyra/screen.h"
 #include "kyra/wsamovie.h"
 #include "kyra/timer.h"
 #include "kyra/sound.h"
+#include "kyra/resource.h"
 
 #include "common/savefile.h"
 
 namespace Kyra {
 
-void KyraEngine_v2::loadButtonShapes() {
+void KyraEngine_HoF::loadButtonShapes() {
 	const uint8 *src = _screen->getCPagePtr(3);
 	_screen->loadBitmap("_BUTTONS.CSH", 3, 3, 0);
 
@@ -55,7 +56,7 @@
 	_buttonShapes[18] = _screen->makeShapeCopy(src, 18);
 }
 
-void KyraEngine_v2::setupLangButtonShapes() {
+void KyraEngine_HoF::setupLangButtonShapes() {
 	switch (_lang) {
 	case 0:
 		_inventoryButtons[0].data0ShapePtr = _buttonShapes[6];
@@ -79,7 +80,7 @@
 	}
 }
 
-GUI_v2::GUI_v2(KyraEngine_v2 *vm) : GUI(vm), _vm(vm), _screen(vm->screen_v2()) {
+GUI_v2::GUI_v2(KyraEngine_HoF *vm) : GUI(vm), _vm(vm), _screen(vm->screen_v2()) {
 	_backUpButtonList = _unknownButtonList = 0;
 	initStaticData();
 	_currentMenu = 0;
@@ -443,7 +444,7 @@
 #pragma mark -
 
 
-int KyraEngine_v2::buttonInventory(Button *button) {
+int KyraEngine_HoF::buttonInventory(Button *button) {
 	if (!_screen->isMouseVisible())
 		return 0;
 
@@ -494,7 +495,7 @@
 	return 0;
 }
 
-int KyraEngine_v2::scrollInventory(Button *button) {
+int KyraEngine_HoF::scrollInventory(Button *button) {
 	uint16 *src = _mainCharacter.inventory;
 	uint16 *dst = &_mainCharacter.inventory[10];
 	uint16 temp[5];
@@ -512,7 +513,7 @@
 	return 0;
 }
 
-int KyraEngine_v2::getInventoryItemSlot(uint16 item) {
+int KyraEngine_HoF::getInventoryItemSlot(uint16 item) {
 	for (int i = 0; i < 20; ++i) {
 		if (_mainCharacter.inventory[i] == item)
 			return i;
@@ -520,7 +521,7 @@
 	return -1;
 }
 
-int KyraEngine_v2::findFreeVisibleInventorySlot() {
+int KyraEngine_HoF::findFreeVisibleInventorySlot() {
 	for (int i = 0; i < 10; ++i) {
 		if (_mainCharacter.inventory[i] == 0xFFFF)
 			return i;
@@ -528,7 +529,7 @@
 	return -1;
 }
 
-void KyraEngine_v2::removeItemFromInventory(int slot) {
+void KyraEngine_HoF::removeItemFromInventory(int slot) {
 	_mainCharacter.inventory[slot] = 0xFFFF;
 	if (slot < 10) {
 		_screen->hideMouse();
@@ -537,7 +538,7 @@
 	}
 }
 
-bool KyraEngine_v2::checkInventoryItemExchange(uint16 handItem, int slot) {
+bool KyraEngine_HoF::checkInventoryItemExchange(uint16 handItem, int slot) {
 	bool removeItem = false;
 	uint16 newItem = 0xFFFF;
 
@@ -573,17 +574,17 @@
 	return false;
 }
 
-void KyraEngine_v2::drawInventoryShape(int page, uint16 item, int slot) {
+void KyraEngine_HoF::drawInventoryShape(int page, uint16 item, int slot) {
 	_screen->drawShape(page, getShapePtr(item+64), _inventoryX[slot], _inventoryY[slot], 0, 0);
 	_screen->updateScreen();
 }
 
-void KyraEngine_v2::clearInventorySlot(int slot, int page) {
-	_screen->drawShape(page, _defaultShapeTable[240+slot], _inventoryX[slot], _inventoryY[slot], 0, 0);
+void KyraEngine_HoF::clearInventorySlot(int slot, int page) {
+	_screen->drawShape(page, getShapePtr(240+slot), _inventoryX[slot], _inventoryY[slot], 0, 0);
 	_screen->updateScreen();
 }
 
-void KyraEngine_v2::redrawInventory(int page) {
+void KyraEngine_HoF::redrawInventory(int page) {
 	int pageBackUp = _screen->_curPage;
 	_screen->_curPage = page;
 
@@ -602,7 +603,7 @@
 	_screen->_curPage = pageBackUp;
 }
 
-void KyraEngine_v2::scrollInventoryWheel() {
+void KyraEngine_HoF::scrollInventoryWheel() {
 	WSAMovieV2 movie(this, _screen);
 	movie.open("INVWHEEL.WSA", 0, 0);
 	int frames = movie.opened() ? movie.frames() : 6;
@@ -648,7 +649,7 @@
 
 // spellbook specific code
 
-int KyraEngine_v2::bookButton(Button *button) {
+int KyraEngine_HoF::bookButton(Button *button) {
 	if (!queryGameFlag(1)) {
 		objectChat(getTableString(0xEB, _cCodeBuffer, 1), 0, 0x83, 0xEB); 
 		return 0;
@@ -739,7 +740,7 @@
 	return 0;
 }
 
-void KyraEngine_v2::loadBookBkgd() {
+void KyraEngine_HoF::loadBookBkgd() {
 	char filename[16];
 
 	if (_flags.isTalkie)
@@ -783,7 +784,7 @@
 	_screen->loadBitmap(filename, 3, 3, 0);
 }
 
-void KyraEngine_v2::showBookPage() {
+void KyraEngine_HoF::showBookPage() {
 	char filename[16];
 
 	sprintf(filename, "PAGE%.01X.", _bookCurPage);
@@ -811,19 +812,19 @@
 	_screen->showMouse();
 }
 
-void KyraEngine_v2::bookLoop() {
+void KyraEngine_HoF::bookLoop() {
 	Button bookButtons[5];
 
 	GUI_V2_BUTTON(bookButtons[0], 0x24, 0, 0, 1, 1, 1, 0x4487, 0, 0x82, 0xBE, 0x0A, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0);
-	bookButtons[0].buttonCallback = BUTTON_FUNCTOR(KyraEngine_v2, this, &KyraEngine_v2::bookPrevPage);
+	bookButtons[0].buttonCallback = BUTTON_FUNCTOR(KyraEngine_HoF, this, &KyraEngine_HoF::bookPrevPage);
 	GUI_V2_BUTTON(bookButtons[1], 0x25, 0, 0, 1, 1, 1, 0x4487, 0, 0xB1, 0xBE, 0x0A, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0);
-	bookButtons[1].buttonCallback = BUTTON_FUNCTOR(KyraEngine_v2, this, &KyraEngine_v2::bookNextPage);
+	bookButtons[1].buttonCallback = BUTTON_FUNCTOR(KyraEngine_HoF, this, &KyraEngine_HoF::bookNextPage);
 	GUI_V2_BUTTON(bookButtons[2], 0x26, 0, 0, 1, 1, 1, 0x4487, 0, 0x8F, 0xBE, 0x21, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0);
-	bookButtons[2].buttonCallback = BUTTON_FUNCTOR(KyraEngine_v2, this, &KyraEngine_v2::bookClose);
+	bookButtons[2].buttonCallback = BUTTON_FUNCTOR(KyraEngine_HoF, this, &KyraEngine_HoF::bookClose);
 	GUI_V2_BUTTON(bookButtons[3], 0x27, 0, 0, 1, 1, 1, 0x4487, 0, 0x08, 0x08, 0x90, 0xB4, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0);
-	bookButtons[3].buttonCallback = BUTTON_FUNCTOR(KyraEngine_v2, this, &KyraEngine_v2::bookPrevPage);
+	bookButtons[3].buttonCallback = BUTTON_FUNCTOR(KyraEngine_HoF, this, &KyraEngine_HoF::bookPrevPage);
 	GUI_V2_BUTTON(bookButtons[4], 0x28, 0, 0, 1, 1, 1, 0x4487, 0, 0xAA, 0x08, 0x8E, 0xB4, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0);
-	bookButtons[4].buttonCallback = BUTTON_FUNCTOR(KyraEngine_v2, this, &KyraEngine_v2::bookNextPage);
+	bookButtons[4].buttonCallback = BUTTON_FUNCTOR(KyraEngine_HoF, this, &KyraEngine_HoF::bookNextPage);
 
 	Button *buttonList = 0;
 	
@@ -851,7 +852,7 @@
 	_screen->clearPage(2);
 }
 
-void KyraEngine_v2::bookDecodeText(uint8 *str) {
+void KyraEngine_HoF::bookDecodeText(uint8 *str) {
 	uint8 *dst = str, *op = str;
 	while (*op != 0x1A) {
 		while (*op != 0x1A && *op != 0x0D)
@@ -866,7 +867,7 @@
 	*dst = 0;
 }
 
-void KyraEngine_v2::bookPrintText(int dstPage, const uint8 *str, int x, int y, uint8 color) {
+void KyraEngine_HoF::bookPrintText(int dstPage, const uint8 *str, int x, int y, uint8 color) {
 	int curPageBackUp = _screen->_curPage;
 	_screen->_curPage = dstPage;
 
@@ -883,24 +884,24 @@
 	_screen->_curPage = curPageBackUp;
 }
 
-int KyraEngine_v2::bookPrevPage(Button *button) {
+int KyraEngine_HoF::bookPrevPage(Button *button) {
 	_bookNewPage = MAX<int>(_bookCurPage-2, 0);
 	return 0;
 }
 
-int KyraEngine_v2::bookNextPage(Button *button) {
+int KyraEngine_HoF::bookNextPage(Button *button) {
 	_bookNewPage = MIN<int>(_bookCurPage+2, _bookMaxPage);
 	return 0;
 }
 
-int KyraEngine_v2::bookClose(Button *button) {
+int KyraEngine_HoF::bookClose(Button *button) {
 	_bookShown = false;
 	return 0;
 }
 
 // cauldron specific code
 
-int KyraEngine_v2::cauldronClearButton(Button *button) {
+int KyraEngine_HoF::cauldronClearButton(Button *button) {
 	if (!queryGameFlag(2)) {
 		updateCharFacing();
 		objectChat(getTableString(0xF0, _cCodeBuffer, 1), 0, 0x83, 0xF0);
@@ -926,7 +927,7 @@
 	return 0;
 }
 
-int KyraEngine_v2::cauldronButton(Button *button) {
+int KyraEngine_HoF::cauldronButton(Button *button) {
 	if (!queryGameFlag(2)) {
 		objectChat(getTableString(0xF0, _cCodeBuffer, 1), 0, 0x83, 0xF0);
 		return 0;

Modified: scummvm/trunk/engines/kyra/gui_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.h	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/gui_v2.h	2008-05-02 14:46:30 UTC (rev 31817)
@@ -91,13 +91,13 @@
 
 namespace Kyra {
 
-class KyraEngine_v2;
+class KyraEngine_HoF;
 class Screen_v2;
 
 class GUI_v2 : public GUI {
-friend class KyraEngine_v2;
+friend class KyraEngine_HoF;
 public:
-	GUI_v2(KyraEngine_v2 *engine);
+	GUI_v2(KyraEngine_HoF *engine);
 
 	Button *addButtonToList(Button *list, Button *newButton);
 
@@ -145,7 +145,7 @@
 
 	void resetState(int item);
 
-	KyraEngine_v2 *_vm;
+	KyraEngine_HoF *_vm;
 	Screen_v2 *_screen;
 
 	bool _buttonListChanged;

Modified: scummvm/trunk/engines/kyra/gui_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v3.cpp	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/gui_v3.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -24,14 +24,15 @@
  */
 
 #include "kyra/gui_v3.h"
-#include "kyra/kyra_v3.h"
-#include "kyra/text_v3.h"
+#include "kyra/kyra_mr.h"
+#include "kyra/text_mr.h"
 #include "kyra/wsamovie.h"
+#include "kyra/resource.h"
 
 namespace Kyra {
 
-void KyraEngine_v3::showMessage(const char *string, uint8 c0, uint8 c1) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::showMessage('%s', %d, %d)", string, c0, c1);
+void KyraEngine_MR::showMessage(const char *string, uint8 c0, uint8 c1) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::showMessage('%s', %d, %d)", string, c0, c1);
 	_shownMessage = string;
 	_screen->hideMouse();
 
@@ -51,13 +52,13 @@
 	_screen->showMouse();
 }
 
-void KyraEngine_v3::showMessageFromCCode(int string, uint8 c0, int) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::showMessageFromCCode(%d, %d, -)", string, c0);
+void KyraEngine_MR::showMessageFromCCode(int string, uint8 c0, int) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::showMessageFromCCode(%d, %d, -)", string, c0);
 	showMessage((const char*)getTableEntry(_cCodeFile, string), c0, 0xF0);
 }
 
-void KyraEngine_v3::updateItemCommand(int item, int str, uint8 c0) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::updateItemCommand(%d, %d, %d)", item, str, c0);
+void KyraEngine_MR::updateItemCommand(int item, int str, uint8 c0) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::updateItemCommand(%d, %d, %d)", item, str, c0);
 	char buffer[100];
 	char *src = (char*)getTableEntry(_itemFile, item);
 
@@ -74,30 +75,30 @@
 	showMessage(buffer, c0, 0xF0);
 }
 
-void KyraEngine_v3::updateCommandLine() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::updateCommandLine()");
+void KyraEngine_MR::updateCommandLine() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::updateCommandLine()");
 	if (_restoreCommandLine) {
 		restoreCommandLine();
 		_restoreCommandLine = false;
 	}
 }
 
-void KyraEngine_v3::restoreCommandLine() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::restoreCommandLine()");
+void KyraEngine_MR::restoreCommandLine() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::restoreCommandLine()");
 	int y = _inventoryState ? 144 : 188;
 	_screen->copyBlockToPage(0, 0, y, 320, 12, _interfaceCommandLine);
 }
 
-void KyraEngine_v3::updateCLState() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::updateCLState()");
+void KyraEngine_MR::updateCLState() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::updateCLState()");
 	if (_inventoryState)
 		_commandLineY = 145;
 	else
 		_commandLineY = 189;
 }
 
-void KyraEngine_v3::showInventory() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::showInventory()");
+void KyraEngine_MR::showInventory() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::showInventory()");
 	if (!_screen->isMouseVisible())
 		return;
 	if (queryGameFlag(3))
@@ -175,8 +176,8 @@
 	_screen->showMouse();
 }
 
-void KyraEngine_v3::hideInventory() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::hideInventory()");
+void KyraEngine_MR::hideInventory() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::hideInventory()");
 	if (queryGameFlag(3))
 		return;
 
@@ -239,8 +240,8 @@
 	_screen->showMouse();
 }
 
-void KyraEngine_v3::drawMalcolmsMoodText() {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawMalcolmsMoodText()");
+void KyraEngine_MR::drawMalcolmsMoodText() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawMalcolmsMoodText()");
 	static const int stringId[] = { 0x32, 0x37, 0x3C };
 
 	if (queryGameFlag(0x219))
@@ -274,8 +275,8 @@
 	_screen->_curPage = pageBackUp;
 }
 
-void KyraEngine_v3::drawMalcolmsMoodPointer(int frame, int page) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawMalcolmsMoodPointer(%d, %d)", frame, page);
+void KyraEngine_MR::drawMalcolmsMoodPointer(int frame, int page) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawMalcolmsMoodPointer(%d, %d)", frame, page);
 	static const uint8 stateTable[] = {
 		1, 6, 11
 	};
@@ -301,8 +302,8 @@
 	_invWsaFrame = frame;
 }
 
-void KyraEngine_v3::drawJestersStaff(int type, int page) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawJestersStaff(%d, %d)", type, page);
+void KyraEngine_MR::drawJestersStaff(int type, int page) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawJestersStaff(%d, %d)", type, page);
 	int y = 155;
 	if (page == 30) {
 		page = 2;
@@ -313,8 +314,8 @@
 	_screen->drawShape(page, getShapePtr(shape), 217, y, 0, 0);
 }
 
-void KyraEngine_v3::drawScore(int page, int x, int y) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawScore(%d, %d, %d)", page, x, y);
+void KyraEngine_MR::drawScore(int page, int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawScore(%d, %d, %d)", page, x, y);
 	if (page == 30) {
 		page = 2;
 		y -= 144;
@@ -331,8 +332,8 @@
 	_screen->drawShape(page, getShapePtr(shape3+433), x, y, 0, 0);
 }
 
-void KyraEngine_v3::drawScoreCounting(int oldScore, int newScore, int drawOld, const int x) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawScoreCounting(%d, %d, %d, %d)", oldScore, newScore, drawOld, x);
+void KyraEngine_MR::drawScoreCounting(int oldScore, int newScore, int drawOld, const int x) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawScoreCounting(%d, %d, %d, %d)", oldScore, newScore, drawOld, x);
 	int y = 189;
 	if (_inventoryState)
 		y -= 44;
@@ -366,8 +367,8 @@
 	_screen->drawShape(0, getShapePtr(new001+433), x + 16, y, 0, 0);
 }
 
-int KyraEngine_v3::getScoreX(const char *str) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::getScoreX('%s')", str);
+int KyraEngine_MR::getScoreX(const char *str) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::getScoreX('%s')", str);
 	Screen::FontId oldFont = _screen->setFont(Screen::FID_8_FNT);
 	_screen->_charWidth = -2;
 
@@ -379,8 +380,8 @@
 	return x;
 }
 
-void KyraEngine_v3::redrawInventory(int page) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::redrawInventory(%d)", page);
+void KyraEngine_MR::redrawInventory(int page) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::redrawInventory(%d)", page);
 	int yOffset = 0;
 
 	if (page == 30) {
@@ -407,8 +408,8 @@
 		_screen->updateScreen();	
 }
 
-void KyraEngine_v3::clearInventorySlot(int slot, int page) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::clearInventorySlot(%d, %d)", slot, page);
+void KyraEngine_MR::clearInventorySlot(int slot, int page) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::clearInventorySlot(%d, %d)", slot, page);
 	int yOffset = 0;
 	if (page == 30) {
 		page = 2;
@@ -418,8 +419,8 @@
 	_screen->drawShape(page, getShapePtr(slot+422), _inventoryX[slot], _inventoryY[slot] + yOffset, 0, 0);
 }
 
-void KyraEngine_v3::drawInventorySlot(int page, int item, int slot) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::drawInventorySlot(%d, %d, %d)", page, item, slot);
+void KyraEngine_MR::drawInventorySlot(int page, int item, int slot) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::drawInventorySlot(%d, %d, %d)", page, item, slot);
 	int yOffset = 0;
 	if (page == 30) {
 		page = 2;
@@ -429,8 +430,8 @@
 	_screen->drawShape(page, getShapePtr(item+248), _inventoryX[slot], _inventoryY[slot] + yOffset, 0, 0);
 }
 
-int KyraEngine_v3::buttonInventory(Button *button) {
-	debugC(9, kDebugLevelMain, "KyraEngine_v3::buttonInventory(%p)", (const void*)button);
+int KyraEngine_MR::buttonInventory(Button *button) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::buttonInventory(%p)", (const void*)button);
 	setNextIdleAnimTimer();
 	if (!_enableInventory || !_inventoryState || !_screen->isMouseVisible())
 		return 0;
@@ -483,7 +484,7 @@
 	return 0;
 }
 
-int KyraEngine_v3::buttonMoodChange(Button *button) {
+int KyraEngine_MR::buttonMoodChange(Button *button) {
 	if (queryGameFlag(0x219)) {
 		snd_playSoundEffect(0x0D, 0xC8);
 		return 0;
@@ -550,7 +551,7 @@
 	return 0;
 }
 
-int KyraEngine_v3::buttonShowScore(Button *button) {
+int KyraEngine_MR::buttonShowScore(Button *button) {
 	strcpy(_stringBuffer, (const char*)getTableEntry(_cCodeFile, 18));
 
 	char *buffer = _stringBuffer;
@@ -573,7 +574,7 @@
 	return 0;
 }
 
-int KyraEngine_v3::buttonJesterStaff(Button *button) {
+int KyraEngine_MR::buttonJesterStaff(Button *button) {
 	makeCharFacingMouse();
 	if (_itemInHand == 27) {
 		_screen->hideMouse();
@@ -606,7 +607,7 @@
 
 #pragma mark -
 
-GUI_v3::GUI_v3(KyraEngine_v3 *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) {
+GUI_v3::GUI_v3(KyraEngine_MR *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) {
 	_backUpButtonList = _unknownButtonList = 0;
 	_buttonListChanged = false;
 }

Modified: scummvm/trunk/engines/kyra/gui_v3.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_v3.h	2008-05-02 14:30:06 UTC (rev 31816)
+++ scummvm/trunk/engines/kyra/gui_v3.h	2008-05-02 14:46:30 UTC (rev 31817)
@@ -53,13 +53,13 @@
 	button.data2Val3 = s; \
 	button.flags2 = t;
 
-class KyraEngine_v3;
-class Screen_v3;
+class KyraEngine_MR;
+class Screen_MR;
 
 class GUI_v3 : public GUI {
-friend class KyraEngine_v3;
+friend class KyraEngine_MR;
 public:
-	GUI_v3(KyraEngine_v3 *engine);
+	GUI_v3(KyraEngine_MR *engine);
 
 	Button *addButtonToList(Button *list, Button *newButton);
 
@@ -84,8 +84,8 @@
 	uint8 defaultColor1() const { return 0xCF; }
 	uint8 defaultColor2() const { return 0xF8; }
 
-	KyraEngine_v3 *_vm;
-	Screen_v3 *_screen;
+	KyraEngine_MR *_vm;
+	Screen_MR *_screen;
 
 	bool _buttonListChanged;
 	Button *_backUpButtonList;

Copied: scummvm/trunk/engines/kyra/items_hof.cpp (from rev 31808, scummvm/trunk/engines/kyra/items_v2.cpp)
===================================================================
--- scummvm/trunk/engines/kyra/items_hof.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/items_hof.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -0,0 +1,511 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_hof.h"
+
+namespace Kyra {
+
+int KyraEngine_HoF::findFreeItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::findFreeItem()");
+	for (int i = 0; i < 30; ++i) {
+		if (_itemList[i].id == 0xFFFF)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_HoF::countAllItems() {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::countAllItems()");
+	int num = 0;
+	for (int i = 0; i < 30; ++i) {
+		if (_itemList[i].id != 0xFFFF)
+			++num;
+	}
+	return num;
+}
+
+int KyraEngine_HoF::findItem(uint16 sceneId, uint16 id) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::findItem(%u, %u)", sceneId, id);
+	for (int i = 0; i < 30; ++i) {
+		if (_itemList[i].id == id && _itemList[i].sceneId == sceneId)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_HoF::checkItemCollision(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::checkItemCollision(%d, %d)", x, y);
+	int itemPos = -1, yPos = -1;
+
+	for (int i = 0; i < 30; ++i) {
+		const Item &curItem = _itemList[i];
+
+		if (curItem.id == 0xFFFF || curItem.sceneId != _mainCharacter.sceneId)
+			continue;
+
+		int itemX1 = curItem.x - 8 - 3;
+		int itemX2 = curItem.x + 7 + 3;
+
+		if (x < itemX1 || x > itemX2)
+			continue;
+
+		int itemY1 = curItem.y - _itemHtDat[curItem.id] - 3;
+		int itemY2 = curItem.y + 3;
+
+		if (y < itemY1 || y > itemY2)
+			continue;
+
+		if (curItem.y >= yPos) {
+			itemPos = i;
+			yPos = curItem.y;
+		}
+	}
+
+	return itemPos;
+}
+
+void KyraEngine_HoF::resetItemList() {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::resetItemList()");
+	for (int i = 0; i < 30; ++i) {
+		_itemList[i].id = 0xFFFF;
+		_itemList[i].sceneId = 0xFFFF;
+		_itemList[i].x = 0;
+		_itemList[i].y = 0;
+		_itemList[i].unk7 = 0;
+	}
+}
+
+void KyraEngine_HoF::updateWaterFlasks() {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::updateWaterFlasks()");
+	for (int i = 22; i < 24; i++) {
+		if (_itemInHand == i)
+			setHandItem(i - 1);
+
+		for (int ii = 0; ii < 20; ii++) {
+			if (_mainCharacter.inventory[ii] == i) {
+				_mainCharacter.inventory[ii]--;
+				if (ii < 10) {
+					clearInventorySlot(ii, 0);
+					_screen->drawShape(0, getShapePtr(i + 63), _inventoryX[ii], _inventoryY[ii], 0, 0);
+				}
+			}
+		}
+
+		for (int ii = 0; ii < 30; ii++) {
+			if (_itemList[ii].id == i)
+				_itemList[ii].id--;
+		}
+	}
+}
+
+bool KyraEngine_HoF::dropItem(int unk1, uint16 item, int x, int y, int unk2) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::dropItem(%d, %u, %d, %d, %d)", unk1, item, x, y, unk2);
+	if (_handItemSet <= -1)
+		return false;
+
+	bool success = processItemDrop(_mainCharacter.sceneId, item, x, y, unk1, unk2);
+	if (!success) {
+		snd_playSoundEffect(0x0d);
+		if (countAllItems() >= 30)
+			showMessageFromCCode(5, 0x84, 0);
+	}
+
+	return success;
+}
+
+bool KyraEngine_HoF::processItemDrop(uint16 sceneId, uint16 item, int x, int y, int unk1, int unk2) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::processItemDrop(%u, %u, %d, %d, %d, %d)", sceneId, item, x, y, unk1, unk2);
+	int itemPos = checkItemCollision(x, y);
+
+	if (unk1)
+		itemPos = -1;
+
+	if (itemPos >= 0) {
+		exchangeMouseItem(itemPos);
+		return false;
+	}
+
+	int freeItemSlot = -1;
+
+	if (unk1 != 3) {
+		for (int i = 0; i < 30; ++i) {
+			if (_itemList[i].id == 0xFFFF) {
+				freeItemSlot = i;
+				break;
+			}
+		}
+	}
+
+	if (freeItemSlot == -1)
+		return false;
+
+	if (sceneId != _mainCharacter.sceneId) {
+		_itemList[freeItemSlot].x = x;
+		_itemList[freeItemSlot].y = y;
+		_itemList[freeItemSlot].id = item;
+		_itemList[freeItemSlot].unk7 = 1;
+		_itemList[freeItemSlot].sceneId = sceneId;
+		return true;
+	}
+
+	int itemHeight = _itemHtDat[item];
+
+	// no idea why it's '&&' here and not single checks for x and y
+	if (x == -1 && y == -1) {
+		x = _rnd.getRandomNumberRng(0x10, 0x130);
+		y = _rnd.getRandomNumberRng(0x10, 0x87);
+	}
+
+	int posX = x, posY = y;
+	int itemX = -1, itemY = -1;
+	bool needRepositioning = true;
+
+	while (needRepositioning) {
+		if ((_screen->getDrawLayer(posX, posY) <= 1 && _screen->getDrawLayer2(posX, posY, itemHeight) <= 1 && isDropable(posX, posY)) || posY == 136) {
+			int posX2 = posX, posX3 = posX;
+			bool repositioning = true;
+
+			while (repositioning) {
+				if (isDropable(posX3, posY) && _screen->getDrawLayer(posX3, posY) < 7 && checkItemCollision(posX3, posY) == -1) {
+					itemX = posX3;
+					itemY = posY;
+					needRepositioning = false;
+					repositioning = false;
+				}
+
+				if (isDropable(posX2, posY) && _screen->getDrawLayer(posX2, posY) < 7 && checkItemCollision(posX2, posY) == -1) {
+					itemX = posX2;
+					itemY = posY;
+					needRepositioning = false;
+					repositioning = false;
+				}
+
+				if (repositioning) {
+					posX3 = MAX(posX3 - 2, 16);
+					posX2 = MIN(posX2 + 2, 304);
+
+					if (posX3 <= 16 && posX2 >= 304)
+						repositioning = false;
+				}
+			}
+		}
+
+		if (posY == 136)
+			needRepositioning = false;
+		else
+			posY = MIN(posY + 2, 136);
+	}
+
+	if (itemX == -1 || itemY == -1)
+		return false;
+
+	if (unk1 == 3) {
+		_itemList[freeItemSlot].x = itemX;
+		_itemList[freeItemSlot].y = itemY;
+		return true;
+	} else if (unk1 == 2) {
+		itemDropDown(x, y, itemX, itemY, freeItemSlot, item);
+	}
+
+	if (!unk1)
+		removeHandItem();
+
+	itemDropDown(x, y, itemX, itemY, freeItemSlot, item);
+
+	if (!unk1 && unk2) {
+		int itemStr = 3;
+		if (_lang == 1)
+			itemStr = getItemCommandStringDrop(item);
+		updateCommandLineEx(item+54, itemStr, 0xD6);
+	}
+
+	return true;
+}
+
+void KyraEngine_HoF::itemDropDown(int startX, int startY, int dstX, int dstY, int itemSlot, uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::itemDropDown(%d, %d, %d, %d, %d, %u)", startX, startY, dstX, dstY, itemSlot, item);
+	uint8 *itemShape = getShapePtr(item + 64);
+
+	if (startX == dstX && startY == dstY) {
+		if (_layerFlagTable[_screen->getLayer(dstX, dstY)] && item != 13) {
+			updateCharFacing();
+			snd_playSoundEffect(0x2d);
+			removeHandItem();
+			objectChat(getTableString(0xFF, _cCodeBuffer, 1), 0, 0x83, 0xFF);
+		} else {
+			_itemList[itemSlot].x = dstX;
+			_itemList[itemSlot].y = dstY;
+			_itemList[itemSlot].id = item;
+			_itemList[itemSlot].sceneId = _mainCharacter.sceneId;
+			snd_playSoundEffect(0x0c);
+			addItemToAnimList(itemSlot);
+		}
+	} else {
+		_screen->hideMouse();
+
+		if (startY <= dstY) {
+			int speed = 2;
+			int curY = startY;
+			int curX = startX - 8;
+
+			backUpGfxRect24x24(curX, curY-16);
+			while (curY < dstY) {
+				restoreGfxRect24x24(curX, curY-16);
+
+				curY = MIN(curY + speed, dstY);
+				++speed;
+
+				backUpGfxRect24x24(curX, curY-16);
+				uint32 endDelay = _system->getMillis() + _tickLength;
+
+				_screen->drawShape(0, itemShape, curX, curY-16, 0, 0);
+				_screen->updateScreen();
+
+				// XXX: original doesn't update game state while delaying
+				// our implementation *could* do it, so maybe check this again
+				delayUntil(endDelay);
+			}
+
+			if (dstX != dstY || (dstY - startY > 16)) {
+				snd_playSoundEffect(0x69);
+				speed = MAX(speed, 6);
+				int speedX = ((dstX - startX) << 4) / speed;
+				int origSpeed = speed;
+				speed >>= 1;
+
+				if (dstY - startY <= 8)
+					speed >>= 1;
+
+				speed = -speed;
+
+				curX = startX << 4;
+
+				int x = 0, y = 0;
+				while (--origSpeed) {
+					x = (curX >> 4) - 8;
+					y = curY - 16;
+
+					restoreGfxRect24x24(x, y);
+					curY = MIN(curY + speed, dstY);
+					curX += speedX;
+					++speed;
+
+					x = (curX >> 4) - 8;
+					y = curY - 16;
+					backUpGfxRect24x24(x, y);
+
+					uint16 endDelay = _system->getMillis() + _tickLength;
+					_screen->drawShape(0, itemShape, x, y, 0, 0);
+					_screen->updateScreen();
+
+					// XXX: original doesn't update game state while delaying
+					// our implementation *could* do it, so maybe check this again
+					delayUntil(endDelay);
+				}
+
+				restoreGfxRect24x24(x, y);
+			} else {
+				restoreGfxRect24x24(curX, curY-16);
+			}
+		}
+
+		if (_layerFlagTable[_screen->getLayer(dstX, dstY)] && item != 13) {
+			updateCharFacing();
+			snd_playSoundEffect(0x2d);
+			removeHandItem();
+			_screen->showMouse();
+			objectChat(getTableString(0xFF, _cCodeBuffer, 1), 0, 0x83, 0xFF);
+		} else {
+			_itemList[itemSlot].x = dstX;
+			_itemList[itemSlot].y = dstY;
+			_itemList[itemSlot].id = item;
+			_itemList[itemSlot].sceneId = _mainCharacter.sceneId;
+			snd_playSoundEffect(0x0c);
+			addItemToAnimList(itemSlot);
+			_screen->showMouse();
+		}
+	}
+}
+
+void KyraEngine_HoF::exchangeMouseItem(int itemPos) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::exchangeMouseItem(%d)", itemPos);
+	_screen->hideMouse();
+
+	deleteItemAnimEntry(itemPos);
+
+	int itemId = _itemList[itemPos].id;
+	_itemList[itemPos].id = _itemInHand;
+	_itemInHand = itemId;
+
+	addItemToAnimList(itemPos);
+	snd_playSoundEffect(0x0b);
+	setMouseCursor(_itemInHand);
+	int str2 = 7;
+
+	if (_lang == 1)
+		str2 = getItemCommandStringPickUp(itemId);
+
+	updateCommandLineEx(itemId + 54, str2, 0xD6);
+	_screen->showMouse();
+
+	runSceneScript6();
+}
+
+bool KyraEngine_HoF::pickUpItem(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::pickUpItem(%d, %d)", x, y);
+	int itemPos = checkItemCollision(x, y);
+
+	if (itemPos <= -1)
+		return false;
+
+	if (_itemInHand >= 0) {
+		exchangeMouseItem(itemPos);
+	} else {
+		_screen->hideMouse();
+		deleteItemAnimEntry(itemPos);
+		int itemId = _itemList[itemPos].id;
+		_itemList[itemPos].id = 0xFFFF;
+		snd_playSoundEffect(0x0b);
+		setMouseCursor(itemId);
+		int str2 = 7;
+
+		if (_lang == 1)
+			str2 = getItemCommandStringPickUp(itemId);
+
+		updateCommandLineEx(itemId + 54, str2, 0xD6);
+		_itemInHand = itemId;
+		_screen->showMouse();
+
+		runSceneScript6();
+	}
+
+	return true;
+}
+
+bool KyraEngine_HoF::isDropable(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::isDropable(%d, %d)", x, y);
+	if (x < 14 || x > 304 || y < 14 || y > 136)
+		return false;
+
+	x -= 8;
+	y -= 1;
+
+	for (int xpos = x; xpos < x + 16; ++xpos) {
+		if (_screen->getShapeFlag1(xpos, y) == 0)
+			return false;
+	}
+
+	return true;
+}
+
+int KyraEngine_HoF::getItemCommandStringDrop(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::getItemCommandStringDrop(%u)", item);
+	assert(item < _itemStringMapSize);
+	int stringId = _itemStringMap[item];
+
+	static const int dropStringIds[] = {
+		0x2D, 0x103, 0x003, 0x106
+	};
+	assert(stringId < ARRAYSIZE(dropStringIds));
+
+	return dropStringIds[stringId];
+}
+
+int KyraEngine_HoF::getItemCommandStringPickUp(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::getItemCommandStringPickUp(%u)", item);
+	assert(item < _itemStringMapSize);
+	int stringId = _itemStringMap[item];
+
+	static const int pickUpStringIds[] = {
+		0x02B, 0x102, 0x007, 0x105
+	};
+	assert(stringId < ARRAYSIZE(pickUpStringIds));
+
+	return pickUpStringIds[stringId];
+}
+
+int KyraEngine_HoF::getItemCommandStringInv(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::getItemCommandStringInv(%u)", item);
+	assert(item < _itemStringMapSize);
+	int stringId = _itemStringMap[item];
+
+	static const int pickUpStringIds[] = {
+		0x02C, 0x104, 0x008, 0x107
+	};
+	assert(stringId < ARRAYSIZE(pickUpStringIds));
+
+	return pickUpStringIds[stringId];
+}
+
+void KyraEngine_HoF::setMouseCursor(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::setMouseCursor(%u)", item);
+	int shape = 0;
+	int hotX = 1;
+	int hotY = 1;
+
+	if (item != 0xFFFF) {
+		hotX = 8;
+		hotY = 15;
+		shape = item+64;
+	}
+
+	_screen->setMouseCursor(hotX, hotY, getShapePtr(shape));
+}
+
+void KyraEngine_HoF::setHandItem(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::setHandItem(%u)", item);
+	_screen->hideMouse();
+
+	if (item == 0xFFFF) {
+		removeHandItem();
+	} else {
+		setMouseCursor(item);
+		_itemInHand = item;
+	}
+
+	_screen->showMouse();
+}
+
+void KyraEngine_HoF::removeHandItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::removeHandItem()");
+	_screen->hideMouse();
+	_screen->setMouseCursor(0, 0, getShapePtr(0));
+	_itemInHand = -1;
+	_handItemSet = -1;
+	_screen->showMouse();
+}
+
+bool KyraEngine_HoF::itemIsFlask(int item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_HoF::itemIsFlask(%d)", item);
+	for (int i = 0; _flaskTable[i] != -1; ++i) {
+		if (_flaskTable[i] == item)
+			return true;
+	}
+
+	return false;
+}
+
+} // end of namespace Kyra
+

Copied: scummvm/trunk/engines/kyra/items_mr.cpp (from rev 31808, scummvm/trunk/engines/kyra/items_v3.cpp)
===================================================================
--- scummvm/trunk/engines/kyra/items_mr.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/items_mr.cpp	2008-05-02 14:46:30 UTC (rev 31817)
@@ -0,0 +1,644 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_mr.h"
+#include "kyra/timer.h"
+
+namespace Kyra {
+
+void KyraEngine_MR::resetItem(int index) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::resetItem(%d)", index);
+	_itemList[index].id = 0xFFFF;
+	_itemList[index].sceneId = 0xFFFF;
+	_itemList[index].x = 0;
+	_itemList[index].y = 0;
+	_itemList[index].unk8 = 0;
+}
+
+void KyraEngine_MR::resetItemList() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::resetItemList()");
+	for (int i = 0; i < 50; ++i)
+		resetItem(i);
+}
+
+void KyraEngine_MR::removeTrashItems() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::removeTrashItems()");
+	for (int i = 0; _trashItemList[i] != 0xFF; ++i) {
+		for (int item = findItem(_trashItemList[i]); item != -1; item = findItem(_trashItemList[i])) {
+			if (_itemList[item].sceneId != _mainCharacter.sceneId)
+				resetItem(item);
+			else
+				break;
+		}
+	}
+}
+
+int KyraEngine_MR::findFreeItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::findFreeItem()");
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == 0xFFFF)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_MR::findFreeInventorySlot() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::findFreeInventorySlot()");
+	for (int i = 0; i < 10; ++i) {
+		if (_mainCharacter.inventory[i] == 0xFFFF)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_MR::findItem(uint16 sceneId, uint16 id) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::findItem(%u, %u)", sceneId, id);
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == id && _itemList[i].sceneId == sceneId)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_MR::findItem(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::findItem(%u)", item);
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == item)
+			return i;
+	}
+	return -1;
+}
+
+int KyraEngine_MR::countAllItems() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::countAllItems()");
+	int count = 0;
+
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id != 0xFFFF)
+			++count;
+	}
+
+	return count;
+}
+
+int KyraEngine_MR::checkItemCollision(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::checkItemCollision(%d, %d)", x, y);
+	int itemIndex = -1;
+	int maxItemY = -1;
+
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == 0xFFFF || _itemList[i].sceneId != _mainCharacter.sceneId)
+			continue;
+
+		const int x1 = _itemList[i].x - 11;
+		const int x2 = _itemList[i].x + 10;
+
+		if (x < x1 || x > x2)
+			continue;
+
+		const int y1 = _itemList[i].y - _itemBuffer1[_itemList[i].id] - 3;
+		const int y2 = _itemList[i].y + 3;
+
+		if (y < y1 || y > y2)
+			continue;
+
+		if (_itemList[i].y >= maxItemY) {
+			itemIndex = i;
+			maxItemY = _itemList[i].y;
+		}
+	}
+
+	return itemIndex;
+}
+
+void KyraEngine_MR::setMouseCursor(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::setMouseCursor(%u)", item);
+	int shape = 0;
+	int hotX = 1;
+	int hotY = 1;
+
+	if (item != 0xFFFF) {
+		hotX = 12;
+		hotY = 19;
+		shape = item+248;
+	}
+
+	if ((int16)item != _itemInHand)
+		_screen->setMouseCursor(hotX, hotY, getShapePtr(shape));
+}
+
+void KyraEngine_MR::setItemMouseCursor() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::setItemMouseCursor()");
+	_handItemSet = _itemInHand;
+	if (_itemInHand == -1)
+		_screen->setMouseCursor(0, 0, _gameShapes[0]);
+	else
+		_screen->setMouseCursor(12, 19, _gameShapes[_itemInHand+248]);
+}
+
+void KyraEngine_MR::setHandItem(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::setHandItem(%u)", item);
+	_screen->hideMouse();
+
+	if (item == 0xFFFF) {
+		removeHandItem();
+	} else {
+		setMouseCursor(item);
+		_itemInHand = item;
+	}
+
+	_screen->showMouse();
+}
+
+void KyraEngine_MR::removeHandItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::removeHandItem()");
+	_screen->hideMouse();
+	_screen->setMouseCursor(0, 0, _gameShapes[0]);
+	_itemInHand = -1;
+	_handItemSet = -1;
+	_screen->showMouse();
+}
+
+bool KyraEngine_MR::dropItem(int unk1, uint16 item, int x, int y, int unk2) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::dropItem(%d, %d, %d, %d, %d)", unk1, item, x, y, unk2);
+
+	if (_handItemSet <= -1)
+		return false;
+
+	if (processItemDrop(_mainCharacter.sceneId, item, x, y, unk1, unk2))
+		return true;
+
+	snd_playSoundEffect(13, 200);
+
+	if (countAllItems() >= 50) {
+		removeTrashItems();
+		if (processItemDrop(_mainCharacter.sceneId, item, x, y, unk1, unk2))
+			return true;
+
+		if (countAllItems() >= 50)
+			showMessageFromCCode(14, 0xB3, 0);
+	}
+
+	if (!_chatText)
+		snd_playSoundEffect(13, 200);
+	return false;
+}
+
+bool KyraEngine_MR::processItemDrop(uint16 sceneId, uint16 item, int x, int y, int unk1, int unk2) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::processItemDrop(%d, %d, %d, %d, %d, %d)", sceneId, item, x, y, unk1, unk2);
+
+	int itemPos = checkItemCollision(x, y);
+
+	if (unk1)
+		itemPos = -1;
+
+	if (itemPos >= 0) {
+		exchangeMouseItem(itemPos, 1);	
+		return true;
+	}
+
+	int freeItemSlot = -1;
+
+	if (unk2 != 3) {
+		for (int i = 0; i < 50; ++i) {
+			if (_itemList[i].id == 0xFFFF) {
+				freeItemSlot = i;
+				break;
+			}
+		}
+	}
+
+	if (freeItemSlot < 0)
+		return false;
+
+	if (_mainCharacter.sceneId != sceneId) {
+		_itemList[freeItemSlot].x = x;
+		_itemList[freeItemSlot].y = y;
+		_itemList[freeItemSlot].id = item;
+		_itemList[freeItemSlot].unk8 = 1;
+		_itemList[freeItemSlot].sceneId = sceneId;
+		return true;
+	}
+
+	int itemHeight = _itemBuffer1[item];
+
+	// no idea why it's '&&' here and not single checks for x and y
+	if (x == -1 && y == -1) {
+		x = _rnd.getRandomNumberRng(0x18, 0x128);
+		y = _rnd.getRandomNumberRng(0x14, 0x87);
+	}
+
+	int posX = x, posY = y;
+	int itemX = -1, itemY = -1;
+	bool needRepositioning = true;
+
+	while (needRepositioning) {

@@ Diff output truncated at 100000 characters. @@

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