[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