[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