[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.63,1.64 kyra.h,1.29,1.30 screen.cpp,1.19,1.20

Johannes Schickel lordhoto at users.sourceforge.net
Sun Oct 30 11:59:10 CET 2005


Update of /cvsroot/scummvm/scummvm/kyra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6438

Modified Files:
	kyra.cpp kyra.h screen.cpp 
Log Message:
Implemented initSceneObjectList, fixed bug with wrong drawn mouse,
also fixed a bug in loadCharacterShapes.


Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- kyra.cpp	29 Oct 2005 18:37:40 -0000	1.63
+++ kyra.cpp	30 Oct 2005 19:58:51 -0000	1.64
@@ -284,7 +284,7 @@
 	assert(_animStates);
 	_charactersAnimState = &_animStates[0];
 	_animObjects =  &_animStates[5];
-	_unkAnimsBuffer = &_animStates[16];
+	_animItems = &_animStates[16];
 	
 	_scriptInterpreter = new ScriptHelper(this);
 	assert(_scriptInterpreter);
@@ -314,7 +314,7 @@
 	_talkMessageH = 0;
 	_talkMessagePrinted = false;
 	
-	_mouseX = _mouseY = 0;
+	_mouseX = _mouseY = -1;
 	_needMouseUpdate = true;
 	
 	_brandonPosX = _brandonPosY = -1;
@@ -432,14 +432,11 @@
 	}
 	loadCharacterShapes();
 	loadSpecialEffectShapes();
-	loadSpecialEffectShapes();
 	loadItems();
 	loadMainScreen();
 	loadPalette("PALETTE.COL", _screen->_currentPalette);
 	_screen->setScreenPalette(_screen->_currentPalette);
 	// XXX
-	_screen->showMouse();
-	_screen->hideMouse();
 	initAnimStateList();
 	setCharactersInDefaultScene();
 	
@@ -501,7 +498,6 @@
 
 void KyraEngine::mainLoop() {
 	debug(9, "KyraEngine::mainLoop()");
-	_currentRoom = 11;
 
 	while (!_quitFlag) {
 		int32 frameTime = (int32)_system->getMillis();
@@ -1025,7 +1021,7 @@
 		assert(i < _defaultShapeTableSize);
 		Shape *shape = &_defaultShapeTable[i];
 		if (shape->imageIndex == 0xFF) {
-			_shapes[i+4] = 0;
+			_shapes[i+7+4] = 0;
 			continue;
 		}
 		if (shape->imageIndex != curImage) {
@@ -1033,7 +1029,7 @@
 			loadBitmap(_characterImageTable[shape->imageIndex], 3, 3, 0);
 			curImage = shape->imageIndex;
 		}
-		_shapes[i+4] = _screen->encodeShape(shape->x, shape->y, shape->w, shape->h, 1);
+		_shapes[i+7+4] = _screen->encodeShape(shape->x, shape->y, shape->w, shape->h, 1);
 	}
 	_screen->_curPage = videoPage;
 }
@@ -1848,7 +1844,146 @@
 }
 
 void KyraEngine::initSceneObjectList(int brandonAlive) {
-	warning("STUB: initSceneObjectList");
+	debug(9, "initSceneObjectList(%d)", brandonAlive);
+	for (int i = 0; i < 31; ++i) {
+		_charactersAnimState[i].active = 0;
+	}
+	
+	int startAnimFrame = 0;
+	
+	AnimObject *curAnimState = _charactersAnimState;
+	curAnimState->active = 1;
+	curAnimState->drawY = _currentCharacter->y1;
+	curAnimState->sceneAnimPtr = _shapes[4+_currentCharacter->currentAnimFrame];
+	curAnimState->animFrameNumber = _currentCharacter->currentAnimFrame;
+	startAnimFrame = _currentCharacter->currentAnimFrame-7;
+	int xOffset = _defaultShapeTable[startAnimFrame].xOffset;
+	int yOffset = _defaultShapeTable[startAnimFrame].yOffset;
+	if (_scaleMode) {
+		curAnimState->x1 = _currentCharacter->x1;
+		curAnimState->y1 = _currentCharacter->y1;
+		
+		_brandonScaleX = _scaleTable[_currentCharacter->y1];
+		_brandonScaleY = _scaleTable[_currentCharacter->y1];
+		
+		curAnimState->x1 += (_brandonScaleX * xOffset) >> 8;
+		curAnimState->y1 += (_brandonScaleY * yOffset) >> 8;
+	} else {
+		curAnimState->x1 += _currentCharacter->x1 + xOffset;
+		curAnimState->y1 += _currentCharacter->y1 + yOffset;
+	}
+	curAnimState->x2 = curAnimState->x1;
+	curAnimState->y2 = curAnimState->y1;
+	curAnimState->refreshFlag = 1;
+	curAnimState->bkgdChangeFlag = 1;
+	_objectQueue = 0;
+	_objectQueue = objectAddHead(0, curAnimState);
+	
+	int listAdded = 0;
+	int addedObjects = 1;
+	
+	for (int i = 1; i < 5; ++i) {
+		Character *ch = &_characterList[i];
+		if (ch->sceneId != _currentCharacter->sceneId) {
+			++addedObjects;
+			continue;
+		}
+		
+		curAnimState = &_charactersAnimState[addedObjects];
+		curAnimState->drawY = ch->y1;
+		curAnimState->sceneAnimPtr = _shapes[4+ch->currentAnimFrame];
+		curAnimState->animFrameNumber = ch->currentAnimFrame;
+		startAnimFrame = ch->currentAnimFrame-7;
+		xOffset = _defaultShapeTable[startAnimFrame].xOffset;
+		yOffset = _defaultShapeTable[startAnimFrame].yOffset;
+		if (_scaleMode) {
+			curAnimState->x1 = ch->x1;
+			curAnimState->y1 = ch->y1;
+		
+			_brandonScaleX = _scaleTable[ch->y1];
+			_brandonScaleY = _scaleTable[ch->y1];
+		
+			curAnimState->x1 += (_brandonScaleX * xOffset) >> 8;
+			curAnimState->y1 += (_brandonScaleY * yOffset) >> 8;
+		} else {
+			curAnimState->x1 += ch->x1 + xOffset;
+			curAnimState->y1 += ch->y1 + yOffset;
+		}
+		curAnimState->x2 = curAnimState->x1;
+		curAnimState->y2 = curAnimState->y1;
+		curAnimState->active = 1;
+		curAnimState->refreshFlag = 1;
+		curAnimState->bkgdChangeFlag = 1;
+		
+		if (ch->facing >= 1 && ch->facing <= 3) {
+			curAnimState->flags |= 1;
+		} else if (ch->facing >= 5 && ch->facing <= 7) {
+			curAnimState->flags &= 0xFFFFFFFE;
+		}
+		
+		_objectQueue = objectQueue(_objectQueue, curAnimState);
+		
+		++addedObjects;
+		++listAdded;
+		if (listAdded < 2)
+			i = 5;
+	}
+	
+	for (int i = 0; i < 11; ++i) {
+		curAnimState = &_animObjects[i];
+		curAnimState->active = 0;
+		curAnimState->refreshFlag = 0;
+		curAnimState->bkgdChangeFlag = 0;
+		// XXX this needs the dat loader
+	}
+	
+	for (int i = 0; i < 12; ++i) {
+		curAnimState = &_animItems[i];
+		Room *curRoom = &_roomTable[_currentCharacter->sceneId];
+		byte curItem = curRoom->itemsTable[i];
+		if (curItem != 0xFF) {
+			curAnimState->drawY = curRoom->itemsYPos[i];
+			curAnimState->sceneAnimPtr = _shapes[220+i];
+			curAnimState->animFrameNumber = 0xFFFF;
+			curAnimState->y1 = curRoom->itemsYPos[i];
+			curAnimState->x1 = curRoom->itemsXPos[i];
+			
+			curAnimState->x1 -= (_scaleTable[curAnimState->drawY] >> 1);
+			curAnimState->y1 -= _scaleTable[curAnimState->drawY];
+			
+			curAnimState->x2 = curAnimState->x1;
+			curAnimState->y2 = curAnimState->y1;
+			
+			curAnimState->active = 1;
+			curAnimState->refreshFlag = 1;
+			curAnimState->bkgdChangeFlag = 1;
+			
+			_objectQueue = objectQueue(_objectQueue, curAnimState);
+		} else {
+			curAnimState->active = 0;
+			curAnimState->refreshFlag = 0;
+			curAnimState->bkgdChangeFlag = 0;
+		}
+	}
+	
+	preserveAnyChangedBackgrounds();
+	curAnimState = _charactersAnimState;
+	curAnimState->bkgdChangeFlag = 1;
+	curAnimState->refreshFlag = 1;
+	for (int i = 0; i < 28; ++i) {
+		curAnimState = &_charactersAnimState[i];
+		if (curAnimState->active) {
+			curAnimState->bkgdChangeFlag = 1;
+			curAnimState->refreshFlag = 1;
+		}
+	}
+	restoreAllObjectBackgrounds();
+	preserveAnyChangedBackgrounds();
+	prepDrawAllObjects();
+	_screen->hideMouse();
+	// XXX game_unkScreen
+	_screen->showMouse();
+	copyChangedObjectsForward(0);
 }
 
 #pragma mark -
@@ -2063,15 +2198,17 @@
 			int xpos = curObject->x1;
 			int ypos = curObject->y1;
 			
-			int temp = 0; /*si*/
+			int temp = 0;
 			if (curObject->flags & 0x800) {
 				temp = 7;
+			} else if (!curObject->unk1) {
+				temp = 0;
 			} else {
-				// XXX
+				// XXX temp = sub_13368(curObject->drawY)
 				temp = 0;
 			}
 			
-			// XXX
+			// talking head functionallity
 			if (!true) {
 				// XXX
 			}
@@ -2111,8 +2248,7 @@
 				}
 			} else {
 				if (curObject->index >= 16 && curObject->index <= 27) {
-					// XXX
-					_screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | 4, temp, (int)_scaleTable[curObject->drawY]);
+					_screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | 4, temp, (int)_scaleTable[curObject->drawY], (int)_scaleTable[curObject->drawY]);
 				} else {
 					_screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags, temp);
 				}
@@ -2272,4 +2408,20 @@
 	}
 	return 0;
 }
+
+#pragma mark -
+#pragma mark - Misc stuff
+#pragma mark -
+
+int16 KyraEngine::fetchAnimWidth(const uint8 *shape, int16 mult) {
+	if (_features & GF_TALKIE)
+		shape += 2;
+	return ((int16)READ_LE_UINT16((shape+3))) * mult;
+}
+
+int8 KyraEngine::fetchAnimHeight(const uint8 *shape, int8 mult) {
+	if (_features & GF_TALKIE)
+		shape += 2;
+	return ((int8)*(shape+2)) * mult;
+}
 } // End of namespace Kyra

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- kyra.h	29 Oct 2005 18:37:40 -0000	1.29
+++ kyra.h	30 Oct 2005 19:58:51 -0000	1.30
@@ -83,6 +83,7 @@
 	uint32 active;
 	uint32 refreshFlag;
 	uint32 bkgdChangeFlag;
+	uint32 unk1;
 	uint32 flags;
 	int16 drawY;
 	uint8 *sceneAnimPtr;
@@ -408,6 +409,8 @@
 	void updateAllObjectShapes();
 	void animRefreshNPC(int character);
 	int findDuplicateItemShape(int shape);
+	int16 fetchAnimWidth(const uint8 *shape, int16 mult);
+	int8 fetchAnimHeight(const uint8 *shape, int8 mult);
 	
 	AnimObject *objectRemoveQueue(AnimObject *queue, AnimObject *rem);
 	AnimObject *objectAddHead(AnimObject *queue, AnimObject *head);
@@ -516,7 +519,7 @@
 	AnimObject *_animStates;
 	AnimObject *_charactersAnimState;
 	AnimObject *_animObjects;
-	AnimObject *_unkAnimsBuffer;
+	AnimObject *_animItems;
 	
 	int _curMusicTheme;
 	int _newMusicTheme;

Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- screen.cpp	29 Oct 2005 19:07:43 -0000	1.19
+++ screen.cpp	30 Oct 2005 19:58:51 -0000	1.20
@@ -1694,10 +1694,15 @@
 	// if disableMouse
 	// 	return
 	
+	restoreMouseRect();
+	
 	int width = _mouseWidth;
 	int height = _mouseHeight;
 	int xpos = _vm->mouseX() - _mouseXOffset;
 	int ypos = _vm->mouseY() - _mouseYOffset;
+	if (xpos < -1 || ypos < -1) {
+		return;
+	}
 	
 	int xposTemp = xpos;
 	int yposTemp = ypos;





More information about the Scummvm-git-logs mailing list