[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.78,1.79 kyra.h,1.39,1.40 script_v1.cpp,1.32,1.33
Johannes Schickel
lordhoto at users.sourceforge.net
Fri Dec 9 11:50:12 CET 2005
Update of /cvsroot/scummvm/scummvm/kyra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26571
Modified Files:
kyra.cpp kyra.h script_v1.cpp
Log Message:
Implemented item dropping into a scene and renamed unkItemFunction to processItemDrop.
Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- kyra.cpp 9 Dec 2005 17:36:56 -0000 1.78
+++ kyra.cpp 9 Dec 2005 19:49:45 -0000 1.79
@@ -2619,7 +2619,7 @@
}
if (placeItem) {
- if (!unkItemFunction(room, item, -1, -1, 2, 0))
+ if (!processItemDrop(room, item, -1, -1, 2, 0))
continue;
break;
}
@@ -2704,7 +2704,7 @@
int stop = 0;
while (!stop) {
- stop = unkItemFunction(sceneId, item, xpos, ypos, 3, 0);
+ stop = processItemDrop(sceneId, item, xpos, ypos, 3, 0);
if (!stop) {
xpos = currentRoom->itemsXPos[i] = _rnd.getRandomNumberRng(24, 296);
ypos = currentRoom->itemsYPos[i] = _rnd.getRandomNumberRng(_northExitHeight & 0xFF, 130);
@@ -2734,8 +2734,8 @@
return items;
}
-int KyraEngine::unkItemFunction(uint16 sceneId, uint8 item, int x, int y, int unk1, int unk2) {
- debug(9, "unkItemFunction(%d, %d, %d, %d, %d, %d)", sceneId, item, x, y, unk1, unk2);
+int KyraEngine::processItemDrop(uint16 sceneId, uint8 item, int x, int y, int unk1, int unk2) {
+ debug(9, "processItemDrop(%d, %d, %d, %d, %d, %d)", sceneId, item, x, y, unk1, unk2);
int freeItem = -1;
uint8 itemIndex = findItemAtPos(x, y);
if (unk1) {
@@ -2783,18 +2783,18 @@
int destY = -1;
int destX = -1;
int running = 1;
-
+
while (running) {
if ((_northExitHeight & 0xFF) <= ypos) {
bool running2 = true;
- if (getDrawLayer(xpos, ypos) - 1 < 0) {
+ if (getDrawLayer(xpos, ypos) > 1) {
if (((_northExitHeight >> 8) & 0xFF) != ypos) {
running2 = false;
}
}
- if (getDrawLayer2(xpos, ypos, itemHeight) - 1 < 0) {
+ if (getDrawLayer2(xpos, ypos, itemHeight) > 1) {
if (((_northExitHeight >> 8) & 0xFF) != ypos) {
running2 = false;
}
@@ -2882,7 +2882,7 @@
}
if (unk1 == 2) {
- warning("unkItemFunction unk1 == 2 is NOT implemented");
+ warning("processItemDrop unk1 == 2 is NOT implemented");
// XXX
}
@@ -3009,6 +3009,7 @@
drawY = tempY - 16;
backUpRect0(drawX, drawY);
_screen->drawShape(0, _shapes[220+item], drawX, drawY, 0, 0);
+ delay(1);
_screen->updateScreen();
}
@@ -3024,9 +3025,10 @@
if (addY < 6)
addY = 6;
- int xDiff = destX - x;
+ int xDiff = (destX - x) << 4;
xDiff /= addY;
int startAddY = addY;
+ addY >>= 1;
if (destY - y <= 8) {
addY >>= 1;
}
@@ -3046,9 +3048,10 @@
drawY = tempY - 16;
backUpRect0(drawX, drawY);
_screen->drawShape(0, _shapes[220+item], drawX, drawY, 0, 0);
+ delay(1);
_screen->updateScreen();
}
- restoreRect0(drawX, tempY);
+ restoreRect0(drawX, drawY);
} else {
restoreRect0(drawX, tempY - 16);
}
@@ -3061,6 +3064,18 @@
_screen->showMouse();
}
+void KyraEngine::dropItem(int unk1, int item, int x, int y, int unk2) {
+ debug(9, "dropItem(%d, %d, %d, %d, %d)", unk1, item, x, y, unk2);
+ if (processItemDrop(_currentCharacter->sceneId, item, x, y, unk1, unk2))
+ return;
+ // call kyraPlaySound(54)
+ if (12 == countItemsInScene(_currentCharacter->sceneId)) {
+ // XXX drawSentenceCommand
+ } else {
+ // XXX drawSentenceCommand
+ }
+}
+
#pragma mark -
#pragma mark - Animation specific code
#pragma mark -
@@ -3564,23 +3579,40 @@
return (int16)(((int8)*(shape+2)) * mult) >> 8;
}
+void KyraEngine::rectClip(int &x, int &y, int w, int h) {
+ if (x < 0) {
+ x = 0;
+ } else if (x + w >= 320) {
+ x = 320 - w;
+ }
+ if (y < 0) {
+ y = 0;
+ } else if (y + h >= 200) {
+ y = 200 - h;
+ }
+}
+
void KyraEngine::backUpRect0(int xpos, int ypos) {
debug(9, "backUpRect0(%d, %d)", xpos, ypos);
- _screen->copyRegionToBuffer(_screen->_curPage, xpos, ypos, 4<<3, 24, _shapes[0]);
+ rectClip(xpos, ypos, 3<<3, 24);
+ _screen->copyRegionToBuffer(_screen->_curPage, xpos, ypos, 3<<3, 24, _shapes[0]);
}
void KyraEngine::restoreRect0(int xpos, int ypos) {
debug(9, "restoreRect0(%d, %d)", xpos, ypos);
- _screen->copyBlockToPage(_screen->_curPage, xpos, ypos, 4<<3, 24, _shapes[0]);
+ rectClip(xpos, ypos, 3<<3, 24);
+ _screen->copyBlockToPage(_screen->_curPage, xpos, ypos, 3<<3, 24, _shapes[0]);
}
void KyraEngine::backUpRect1(int xpos, int ypos) {
debug(9, "backUpRect1(%d, %d)", xpos, ypos);
+ rectClip(xpos, ypos, 4<<3, 32);
_screen->copyRegionToBuffer(_screen->_curPage, xpos, ypos, 4<<3, 32, _shapes[1]);
}
void KyraEngine::restoreRect1(int xpos, int ypos) {
debug(9, "restoreRect1(%d, %d)", xpos, ypos);
+ rectClip(xpos, ypos, 4<<3, 32);
_screen->copyBlockToPage(_screen->_curPage, xpos, ypos, 4<<3, 32, _shapes[1]);
}
@@ -3608,7 +3640,7 @@
int layer = 1;
for (int useX = xpos; useX < xpos + 16; ++useX) {
- for (int useY = ypos - height; useY < xpos; ++useY) {
+ for (int useY = ypos - height; useY < ypos; ++useY) {
int tempLayer = _screen->getShapeFlag2(useX, useY);
if (tempLayer > layer) {
layer = tempLayer;
@@ -4539,6 +4571,20 @@
if (exit != 0xFFFF) {
handleSceneChange(xpos, ypos, 1, 1);
return;
+ } else {
+ if (_itemInHand != -1) {
+ if (ypos < 155) {
+ if (hasClickedOnExit(xpos, ypos)) {
+ handleSceneChange(xpos, ypos, 1, 1);
+ return;
+ }
+ dropItem(0, _itemInHand, xpos, ypos, 1);
+ }
+ } else {
+ if (ypos <= 155) {
+ handleSceneChange(xpos, ypos, 1, 1);
+ }
+ }
}
}
}
@@ -4696,6 +4742,19 @@
}
}
+bool KyraEngine::hasClickedOnExit(int xpos, int ypos) {
+ debug(9, "hasClickedOnExit(%d, %d)", xpos, ypos);
+ if (xpos < 16 || xpos >= 304) {
+ return true;
+ }
+ if (ypos < 8)
+ return true;
+ if (ypos < 136 || ypos > 155) {
+ return false;
+ }
+ return true;
+}
+
void KyraEngine::clickEventHandler2() {
debug(9, "clickEventHandler2()");
_scriptInterpreter->initScript(_scriptClick, _scriptClickData);
Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- kyra.h 9 Dec 2005 14:52:31 -0000 1.39
+++ kyra.h 9 Dec 2005 19:49:47 -0000 1.40
@@ -458,6 +458,7 @@
void destroyMouseItem();
void setMouseItem(int item);
void wipeDownMouseItem(int xpos, int ypos);
+ void rectClip(int &x, int &y, int w, int h);
void backUpRect0(int xpos, int ypos);
void restoreRect0(int xpos, int ypos);
void backUpRect1(int xpos, int ypos);
@@ -468,9 +469,10 @@
int clickEventHandler(int xpos, int ypos);
void clickEventHandler2();
void updateMousePointer();
+ bool hasClickedOnExit(int xpos, int ypos);
int countItemsInScene(uint16 sceneId);
- int unkItemFunction(uint16 sceneId, uint8 item, int x, int y, int unk1, int unk2);
+ int processItemDrop(uint16 sceneId, uint8 item, int x, int y, int unk1, int unk2);
void exchangeItemWithMouseItem(uint16 sceneId, int itemIndex);
void addItemToRoom(uint16 sceneId, uint8 item, int itemIndex, int x, int y);
int getDrawLayer(int x, int y);
@@ -478,6 +480,7 @@
int checkNoDropRects(int x, int y);
int isDropable(int x, int y);
void itemDropDown(int x, int y, int destX, int destY, byte freeItem, int item);
+ void dropItem(int unk1, int item, int x, int y, int unk2);
void animRemoveGameItem(int index);
void animAddGameItem(int index, uint16 sceneId);
Index: script_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/script_v1.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- script_v1.cpp 9 Dec 2005 17:36:57 -0000 1.32
+++ script_v1.cpp 9 Dec 2005 19:49:47 -0000 1.33
@@ -1357,7 +1357,7 @@
int KyraEngine::cmd_itemAppearsOnGround(ScriptState *script) {
debug(3, "cmd_itemAppearsOnGround(0x%X) (%d, %d, %d)", script, stackPos(0), stackPos(1), stackPos(2));
- unkItemFunction(_currentCharacter->sceneId, stackPos(0), stackPos(1), stackPos(2), 2, 0);
+ processItemDrop(_currentCharacter->sceneId, stackPos(0), stackPos(1), stackPos(2), 2, 0);
return 0;
}
More information about the Scummvm-git-logs
mailing list