[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.66,1.67 kyra.h,1.32,1.33 screen.cpp,1.22,1.23 screen.h,1.14,1.15 script_v1.cpp,1.18,1.19 sprites.cpp,1.6,1.7 sprites.h,1.4,1.5

Johannes Schickel lordhoto at users.sourceforge.net
Thu Nov 10 06:10:03 CET 2005


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

Modified Files:
	kyra.cpp kyra.h screen.cpp screen.h script_v1.cpp sprites.cpp 
	sprites.h 
Log Message:
Commited patch #1350510 with some little changes. Thanks to vinterstum.


Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- kyra.cpp	9 Nov 2005 22:26:10 -0000	1.66
+++ kyra.cpp	10 Nov 2005 14:08:50 -0000	1.67
@@ -285,7 +285,7 @@
 	_animStates = new AnimObject[31];
 	assert(_animStates);
 	_charactersAnimState = &_animStates[0];
-	_animObjects =  &_animStates[5];
+	_sprites->_animObjects =  &_animStates[5];
 	_animItems = &_animStates[16];
 	
 	_scriptInterpreter = new ScriptHelper(this);
@@ -308,6 +308,8 @@
 	memset(_shapes, 0, sizeof(_shapes));
 	memset(_wsaObjects, 0, sizeof(_wsaObjects));
[...1001 lines suppressed...]
 		if (cur == rem) {
@@ -2424,7 +2820,7 @@
 		cur->nextAnimObject = add;
 		add->nextAnimObject = 0;
 	}
-	return 0;
+	return queue;
 }
 
 #pragma mark -
@@ -2937,7 +3333,8 @@
 		if (!temp)
 			continue;
 		++table;
-		// XXX updateAnimFlags
+		_sprites->updateSceneAnims();
+		waitTicks(10);
 		// XXX updateMousePointer
 		// XXX updateGameTimers
 		updateAllObjectShapes();

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- kyra.h	9 Nov 2005 22:26:11 -0000	1.32
+++ kyra.h	10 Nov 2005 14:08:50 -0000	1.33
@@ -87,7 +87,7 @@
 	uint32 flags;
 	int16 drawY;
 	uint8 *sceneAnimPtr;
-	uint16 animFrameNumber;
+	int16 animFrameNumber;
 	uint8 *background;
 	uint16 rectSize;
 	int16 x1, y1;
@@ -167,13 +167,12 @@
 
 	uint8 game() const { return _game; }
 	uint32 features() const { return _features; }
-	SceneExits sceneExits() const { return _sceneExits; }
-	// ugly hack used by the dat loader
-	SceneExits &sceneExits() { return _sceneExits; }
 	
 	Common::RandomSource _rnd;
 	int16 _northExitHeight;
 
+	Character *_currentCharacter;
+
 	typedef void (KyraEngine::*IntroProc)();
 	typedef int (KyraEngine::*OpcodeProc)(ScriptState *script);
 
@@ -183,16 +182,18 @@
 	const char **seqTextsTable() { return (const char **)_seq_textsTable; }
 
 	bool seq_skipSequence() const;
-	
+	void quitGame();
 	void loadBitmap(const char *filename, int tempPage, int dstPage, uint8 *palData);
 
 	void snd_playTheme(int file, int track = 0);
 	void snd_playTrack(int track);
 	void snd_playVoiceFile(int id);
 	bool snd_voicePlaying();
+	void snd_playSoundEffect(int track);
 
 	void printTalkTextMessage(const char *text, int x, int y, uint8 color, int srcPage, int dstPage);
 	void restoreTalkTextMessageBkgd(int srcPage, int dstPage);
+	void drawSentenceCommand(char *sentence, int unk1);
 
 	WSAMovieV1 *wsa_open(const char *filename, int offscreenDecode, uint8 *palBuf);
 	void wsa_close(WSAMovieV1 *wsa);
@@ -200,6 +201,11 @@
 	void wsa_play(WSAMovieV1 *wsa, int frameNum, int x, int y, int pageNum);
 
 	void waitTicks(int ticks);
+	void updateAllObjectShapes();
+	void flagAllObjectsForRefresh();
+	void animRefreshNPC(int character);
+	int16 fetchAnimWidth(const uint8 *shape, int16 mult);
+	int8 fetchAnimHeight(const uint8 *shape, int8 mult);
 	
 	int mouseX() { return _mouseX; }
 	int mouseY() { return _mouseY; }
@@ -377,6 +383,15 @@
 	int getWidestLineWidth(int linesCount);
 	void calcWidestLineBounds(int &x1, int &x2, int w, int cx);
 	void printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
+	void characterSays(char *msg, int8 charNum, int8 chatDuration);
+	int initCharacterChat(int8 charNum);
+	int8 getChatPartnerNum();
+	void backupChatPartnerAnimFrame(int8 charNum);
+	void restoreChatPartnerAnimFrame(int8 charNum);
+	void endCharacterChat(int8 charNum, int16 arg_4);
+	void waitForChatToFinish(int16 chatDuration, char *str, uint8 charNum);
+	void printCharacterText(char *text, int8 charNum);
+
 	void setCharacterDefaultFrame(int character);
 	void setCharactersPositions(int character);
 	void setCharactersHeight();
@@ -401,16 +416,15 @@
 	byte findItemAtPos(int x, int y);
 	void placeItemInGenericMapScene(int item, int index);
 	void initSceneObjectList(int brandonAlive);
+	void initSceneScreen(int brandonAlive);
+	void preserveAllBackgrounds();
+	void flagAllObjectsForBkgdChange();
 	void restoreAllObjectBackgrounds();
 	void preserveAnyChangedBackgrounds();
 	void preserveOrRestoreBackground(AnimObject *obj, bool restore);
 	void prepDrawAllObjects();
 	void copyChangedObjectsForward(int refreshFlag);
-	void updateAllObjectShapes();
-	void animRefreshNPC(int character);
 	int findDuplicateItemShape(int shape);
-	int16 fetchAnimWidth(const uint8 *shape, int16 mult);
-	int8 fetchAnimHeight(const uint8 *shape, int8 mult);
 	int findWay(int x, int y, int toX, int toY, int *moveTable, int moveTableSize);
 	int findSubPath(int x, int y, int toX, int toY, int *moveTable, int start, int end);
 	int getFacingFromPointToPoint(int x, int y, int toX, int toY);
@@ -424,7 +438,7 @@
 	AnimObject *objectRemoveQueue(AnimObject *queue, AnimObject *rem);
 	AnimObject *objectAddHead(AnimObject *queue, AnimObject *head);
 	AnimObject *objectQueue(AnimObject *queue, AnimObject *add);
-	
+	AnimObject *_animStates;
 	void seq_demo();
 	void seq_intro();
 	void seq_introLogos();
@@ -438,7 +452,7 @@
 	void snd_startTrack();
 	void snd_haltTrack();
 	void snd_setSoundEffectFile(int file);
-	void snd_playSoundEffect(int track);
+
 	
 	static OpcodeProc _opcodeTable[];
 	static const int _opcodeTableSize;
@@ -509,6 +523,9 @@
 	int16 _brandonScaleX;
 	int16 _brandonScaleY;
 	int _brandonDrawFrame;
+
+	uint16 _currentChatPartnerBackupFrame;
+	uint16 _currentCharAnimFrame;
 	
 	int8 *_sceneAnimTable[50];
 	
@@ -528,10 +545,14 @@
 	int _lastFindWayRet;
 	int *_movFacingTable;
 	
+	int8 _charSayUnk1; // this is byte_2EE24
+	int8 _charSayUnk2;
+	int8 _charSayUnk3; // this is byte_2EE25
+	int8 _charSayUnk4; // this is byte_2EE26
+
+	uint8 _configTalkspeed;
 	AnimObject *_objectQueue;
-	AnimObject *_animStates;
 	AnimObject *_charactersAnimState;
-	AnimObject *_animObjects;
 	AnimObject *_animItems;
 	
 	int _curMusicTheme;
@@ -553,7 +574,6 @@
 	ScriptData *_scriptClickData;
 	
 	Character *_characterList;
-	Character *_currentCharacter;
 	
 	uint8 *_seq_Forest;
 	uint8 *_seq_KallakWriting;

Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- screen.cpp	9 Nov 2005 22:26:11 -0000	1.22
+++ screen.cpp	10 Nov 2005 14:08:50 -0000	1.23
@@ -62,11 +62,6 @@
 	_decodeShapeBufferSize = 0;
 	_animBlockPtr = NULL;
 	_animBlockSize = 0;
-	_mouseShape = NULL;
-	_mouseShapeSize = 0;
-	_mouseRect = NULL;
-	_mouseRectSize = 0;
-	_mouseDrawWidth = 0;
 }
 
 Screen::~Screen() {
@@ -75,15 +70,13 @@
 		_pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0;
 	}
 	for (int f = 0; f < ARRAYSIZE(_fonts); ++f) {
-		free(_fonts[f].fontData);
+		delete[] _fonts[f].fontData;
 		_fonts[f].fontData = NULL;
 	}
 	free(_currentPalette);
 	free(_screenPalette);
 	free(_decodeShapeBuffer);
 	free(_animBlockPtr);
-	free(_mouseShape);
-	free(_mouseRect);
 	for (int i = 0; i < 3; ++i) {
 		free(_palettes[i]);
 	}
@@ -305,6 +298,7 @@
 
 void Screen::copyCurPageBlock(int x, int y, int h, int w, uint8 *dst) {
 	debug(9, "Screen::copyCurPageBlock(%d, %d, %d, %d, 0x%X)", x, y, w, h, dst);
+	assert(dst);
 	if (x < 0) {
 		x = 0;	
 	} else if (x >= 40) {
@@ -389,6 +383,8 @@
 	debug(9, "Screen::setAnimBlockPtr(%d)", size);
 	free(_animBlockPtr);
 	_animBlockPtr = (uint8 *)malloc(size);
+	assert(_animBlockPtr);
+	memset(_animBlockPtr, 0, size);
 	_animBlockSize = size;
 }
 
@@ -1590,14 +1586,14 @@
 	debug(9, "hideMouse()");
 	// if mouseDisabled
 	//	return
-	restoreMouseRect();
+	_system->showMouse(false);
 }
 
 void Screen::showMouse() {
 	debug(9, "showMouse()");
 	// if mouseDisabled
 	//	return
-	copyMouseToScreen();
+	_system->showMouse(true);
 }
 
 void Screen::setShapePages(int page1, int page2) {
@@ -1606,140 +1602,30 @@
 	_shapePages[1] = _pagePtrs[page2];
 }
 
-byte *Screen::setMouseCursor(int x, int y, byte *shape) {
+void Screen::setMouseCursor(int x, int y, byte *shape) {
 	debug(9, "setMouseCursor(%d, %d, 0x%X)", x, y, shape);
 	if (!shape)
-		return _mouseShape;
+		return;
 	// if mouseDisabled
 	//	return _mouseShape
-	
-	restoreMouseRect();
-	
+
 	if (_vm->features() & GF_TALKIE)
 		shape += 2;
-	
-	int mouseRectSize = getRectSize((READ_LE_UINT16(shape + 3) >> 3) + 2, shape[5]);
-	if (_mouseRectSize < mouseRectSize) {
-		free(_mouseRect);
-		_mouseRect = (uint8*)malloc(mouseRectSize << 3);
-		assert(_mouseRect);
-		_mouseRectSize = mouseRectSize;
-	}
-	
-	int shapeSize = READ_LE_UINT16(shape + 8) + 10;
-	if (_vm->features() & GF_TALKIE)
-		shapeSize += 2;
-	if (READ_LE_UINT16(shape) & 1)
-		shapeSize += 16;
-	
-	if (_mouseShapeSize < shapeSize) {
-		free(_mouseShape);
-		_mouseShape = (uint8*)malloc(shapeSize);
-		assert(_mouseShape);
-		_mouseShapeSize = shapeSize;
-	}
-	
-	byte *dst = _mouseShape;
-	byte *src = shape;
-	if (_vm->features() & GF_TALKIE)
-		dst += 2;
-	
-	if (!(READ_LE_UINT16(shape) & 2)) {
-		uint16 newFlags = 0;
-		newFlags = READ_LE_UINT16(src) | 2; src += 2;
-		WRITE_LE_UINT16(dst, newFlags); dst += 2;
-		memcpy(dst, src, 6);
-		dst += 6;
-		src += 6;
-		int size = READ_LE_UINT16(src); src += 2;
-		WRITE_LE_UINT16(dst, size); dst += 2;
-		if (newFlags & 1) {
-			memcpy(dst, src, 8);
-			dst += 16;
-			src += 16;
-		}
-		decodeFrame4(src, _animBlockPtr, size);
-		memcpy(dst, _animBlockPtr, size);
-	} else {
-		int size = READ_LE_UINT16(shape + 6);
-		memcpy(dst, src, size);
-	}
-	
-	_mouseXOffset = x; _mouseYOffset = y;
-	if (_vm->features() & GF_TALKIE) {
-		_mouseHeight = _mouseShape[7];
-		_mouseWidth = (READ_LE_UINT16(_mouseShape + 5) >> 3) + 2;
-	} else {
-		_mouseHeight = _mouseShape[5];
-		_mouseWidth = (READ_LE_UINT16(_mouseShape + 3) >> 3) + 2;
-	}
-	
-	copyMouseToScreen();
-	
-	return _mouseShape;
-}
 
-void Screen::restoreMouseRect() {
-	debug(9, "restoreMouseRect()");
-	// if disableMouse
-	//	return
+	int mouseHeight = *(shape+2);
+	int mouseWidth = (READ_LE_UINT16(shape + 3)) + 2;
 	
-	if (_mouseDrawWidth && _mouseRect) {
-		copyScreenFromRect(_mouseDrawX, _mouseDrawY, _mouseDrawWidth, _mouseDrawHeight, _mouseRect);
-	}
-	_mouseDrawWidth = 0;
-}
+	uint8 *cursor = (uint8 *)malloc(mouseHeight * mouseWidth);
+	fillRect(0, 0, mouseWidth, mouseHeight, 0, 3);
+	drawShape(3, shape, 0, 0, 0, 0);
+
+	copyRegionToBuffer(3, 0, 0, mouseWidth, mouseHeight, cursor);
+	_system->setMouseCursor(cursor, mouseWidth, mouseHeight, 0, 0, 0);
+	_system->showMouse(true);
+	free(cursor);
+
+	return;
 
-void Screen::copyMouseToScreen() {
-	debug(9, "copyMouseToScreen()");
-	// 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;
-	
-	if (xposTemp < 0) {
-		xposTemp = 0;
-	}
-	if (yposTemp < 0) {
-		height += ypos;
-		yposTemp = 0;
-	}
-	
-	xposTemp >>= 3;
-	_mouseDrawX = xposTemp;
-	_mouseDrawY = yposTemp;
-	
-	xposTemp += width;
-	xposTemp -= 40;
-	if (xposTemp >= 0) {
-		width -= xposTemp;
-	}
-	
-	yposTemp += height;
-	yposTemp -= 200;
-	if (yposTemp >= 0) {
-		height -= yposTemp;
-	}
-	
-	_mouseDrawWidth = width;
-	_mouseDrawHeight = height;
-	
-	if (_mouseRect) {
-		copyScreenToRect(_mouseDrawX, _mouseDrawY, width, height, _mouseRect);
-	}
-	
-	drawShape(0, _mouseShape, xpos, ypos, 0, 0, 0);
 }
 
 void Screen::copyScreenFromRect(int x, int y, int w, int h, uint8 *ptr) {

Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- screen.h	1 Nov 2005 14:19:50 -0000	1.14
+++ screen.h	10 Nov 2005 14:08:50 -0000	1.15
@@ -123,7 +123,7 @@
 	void hideMouse();
 	void showMouse();
 	void setShapePages(int page1, int page2);
-	byte *setMouseCursor(int x, int y, byte *shape);
+	void setMouseCursor(int x, int y, byte *shape);
 	uint8 *getPalette(int num);
 	
 	byte getShapeFlag1(int x, int y);
@@ -152,15 +152,6 @@
 	int _decodeShapeBufferSize;
 	uint8 *_animBlockPtr;
 	int _animBlockSize;
-	
-	uint8 *_mouseShape;
-	uint8 *_mouseRect;
-	int _mouseShapeSize;
-	int _mouseRectSize;
-	int _mouseDrawX, _mouseDrawY;
-	int _mouseDrawWidth, _mouseDrawHeight;
-	int _mouseWidth, _mouseHeight;
-	int _mouseXOffset, _mouseYOffset;
 
 	OSystem *_system;
 	KyraEngine *_vm;

Index: script_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/script_v1.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- script_v1.cpp	9 Nov 2005 22:26:12 -0000	1.18
+++ script_v1.cpp	10 Nov 2005 14:08:50 -0000	1.19
@@ -122,7 +122,7 @@
 }
 
 void ScriptHelper::c1_ifNotJmp() {
-	if (_curScript->stack[++_curScript->sp-1] != 0) {
+	if (!_curScript->stack[_curScript->sp++]) {
 		_parameter &= 0x7FFF;
 		_curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
 	}
@@ -296,6 +296,7 @@
 #pragma mark -
 
 #define stackPos(x) script->stack[script->sp+x]
+#define stackPosString(x) (char *)&script->dataPtr->text[READ_BE_UINT16( &((uint16 *)script->dataPtr->text)[stackPos(x)])]
 
 int KyraEngine::cmd_magicInMouseItem(ScriptState *script) {
 	warning("STUB: cmd_magicInMouseItem");
@@ -303,7 +304,16 @@
 }
 
 int KyraEngine::cmd_characterSays(ScriptState *script) {
-	warning("STUB: cmd_characterSays");
+	debug(9, "cmd_characterSays(0x%X)", script);
+	// Japanese version?
+	/*const char *str1 = "âuâëâôââôüAé?é¢ùêé¢é+é®üH";
+	const char *str2 = "âuâëâôâ\\âôüAé?é¢ùêé¢é+é®üH";
+
+	if (strcmp(stackPosString(0), str1) == 0)
+		characterSays((char *)str2, stackPos(1), stackPos(2));
+	else*/
+	characterSays(stackPosString(0), stackPos(1), stackPos(2));
+
 	return 0;
 }
 
@@ -314,7 +324,7 @@
 
 int KyraEngine::cmd_drawSceneAnimShape(ScriptState *script) {
 	debug(9, "cmd_drawSceneAnimShape(0x%X)", script);
-	_screen->drawShape(stackPos(4), _sprites->getSceneShape(stackPos(0)), stackPos(1), stackPos(2), 0, stackPos(3));
+	_screen->drawShape(stackPos(4), _sprites->_sceneShapes[stackPos(0)], stackPos(1), stackPos(2), 0, stackPos(3));
 	return 0;
 }
 
@@ -417,13 +427,13 @@
 
 int KyraEngine::cmd_sceneAnimOn(ScriptState *script) {
 	debug(9, "cmd_sceneAnimOn(0x%X)", script);
-	_sprites->enableAnim(stackPos(0));
+	_sprites->_anims[stackPos(0)].play = true;
 	return 0;
 }
 
 int KyraEngine::cmd_sceneAnimOff(ScriptState *script) {
 	debug(9, "cmd_sceneAnimOff(0x%X)", script);
-	_sprites->disableAnim(stackPos(0));
+	_sprites->_anims[stackPos(0)].play = false;
 	return 0;
 }
 
@@ -530,7 +540,8 @@
 }
 
 int KyraEngine::cmd_internalAnimOn(ScriptState *script) {
-	warning("STUB: cmd_internalAnimOn");
+	debug(9, "cmd_internalAnimOn(0x%X)", script);
+	_sprites->_animObjects[stackPos(0)].active = 1;
 	return 0;
 }
 
@@ -552,11 +563,8 @@
 int KyraEngine::cmd_openWSAFile(ScriptState *script) {
 	debug(9, "cmd_openWSAFile(0x%X)", script);
 	
-	int wsaIndex = stackPos(0);
-	uint16 offset = READ_BE_UINT16(&script->dataPtr->text[wsaIndex]);
-	char *filename = (char*)&script->dataPtr->text[offset];
-	
-	wsaIndex = stackPos(1);
+	char *filename = stackPosString(0);
+	int wsaIndex = stackPos(1);
 	// stackPos(2) is NOT used whyever
 	int offscreenDecode = 0;
 	if (!stackPos(3)) {
@@ -646,7 +654,8 @@
 }
 
 int KyraEngine::cmd_restoreAllObjectBackgrounds(ScriptState *script) {
-	warning("STUB: cmd_restoreAllObjectBackgrounds");
+	debug(9, "cmd_restoreAllObjectBackgrounds(0x%X)", script);
+	restoreAllObjectBackgrounds();
 	return 0;
 }
 
@@ -747,7 +756,8 @@
 }
 
 int KyraEngine::cmd_internalAnimOff(ScriptState *script) {
-	warning("STUB: cmd_internalAnimOff");
+	debug(9, "cmd_internalAnimOff(0x%X)", script);
+	_sprites->_animObjects[stackPos(0)].active = 0;
 	return 0;
 }
 
@@ -916,7 +926,7 @@
 		++curPos;
 		// XXX
 		waitTicks(10);
-		// XXX updateAnimFlags();
+		_sprites->updateSceneAnims();
 		// XXX updateMouseCursor();
 		// XXX updateGameTimers();
 		updateAllObjectShapes();
@@ -951,13 +961,17 @@
 }
 
 int KyraEngine::cmd_updateSceneAnimations(ScriptState *script) {
-	warning("STUB: cmd_updateSceneAnimations");
+	debug(9, "cmd_updateSceneAnimations(0x%X)", script);
+	if (stackPos(0)) {
+		_sprites->updateSceneAnims();
+		updateAllObjectShapes();
+	}
 	return 0;
 }
 
 int KyraEngine::cmd_sceneAnimationActive(ScriptState *script) {
-	warning("STUB: cmd_sceneAnimationActive");
-	return 0;
+	debug(9, "cmd_sceneAnimationActive(0x%X)", script);
+	return _sprites->_anims[stackPos(0)].play;
 }
 
 int KyraEngine::cmd_setCharactersMovementDelay(ScriptState *script) {
@@ -1062,7 +1076,9 @@
 }
 
 int KyraEngine::cmd_setSceneAnimCurrXY(ScriptState *script) {
-	warning("STUB: cmd_setSceneAnimCurrXY");
+	debug(9, "cmd_setSceneAnimCurrXY(0x%X)", script);
+	_sprites->_anims[stackPos(0)].x = stackPos(1);
+	_sprites->_anims[stackPos(0)].y = stackPos(2);
 	return 0;
 }
 
@@ -1218,7 +1234,8 @@
 }
 
 int KyraEngine::cmd_message(ScriptState *script) {
-	warning("STUB: cmd_message");
+	debug(9, "cmd_message(0x%X)", script);
+	drawSentenceCommand(stackPosString(0), stackPos(1));
 	return 0;
 }
 

Index: sprites.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/sprites.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- sprites.cpp	9 Nov 2005 22:26:12 -0000	1.6
+++ sprites.cpp	10 Nov 2005 14:08:50 -0000	1.7
@@ -46,82 +46,99 @@
 Sprites::~Sprites() {
 	delete[] _dat;
 	freeSceneShapes();
-}
-
-uint8 *Sprites::getSceneShape(uint8 sceneShapeID) {
-	assert( sceneShapeID < ARRAYSIZE(_sceneShapes));
-	return _sceneShapes[sceneShapeID];
-}
-
-void Sprites::drawSprites(uint8 srcPage, uint8 dstPage) {
-	int flags;
-
 	for (int i = 0; i < MAX_NUM_ANIMS; i++) {
-		if (_anims[i].script == 0 || !_anims[i].play)
-			break;
-		if (_anims[i].sprite >= 0) {
-			assert( _anims[i].sprite < ARRAYSIZE(_sceneShapes));
-			uint8 *sprite = _sceneShapes[_anims[i].sprite];
-
-			//debug(1, "Drawing from X %i, Y %i, to X %i, Y %i, width %i, height %i, srcPage %i, dstPage %i",
-			//	sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage);
-			flags = Screen::CR_CLIPPED;
-			if (_anims[i].flipX)
-				flags |= Screen::CR_X_FLIPPED;
-
-			//_screen->copyRegion(sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage, flags);
-			_screen->drawShape(0, sprite, _anims[i].x, _anims[i].y, 0, 0, 0);
-		}
+		if (_anims[i].background)
+			free(_anims[i].background);
 	}
 }
 
-void Sprites::doAnims() {
-	debug(9, "Sprites::doAnims()");
-	uint32 currTime = _system->getMillis();
-	for (int i = 0; i < MAX_NUM_ANIMS; i++) {
-		if (_anims[i].script == 0 || !_anims[i].play || _anims[i].nextRun != 0 && _anims[i].nextRun > currTime)
-			continue;
+void Sprites::setupSceneAnims() {
+	debug(9, "Sprites::setupSceneAnims()");
+	uint8 *data;
 
-		uint8 *data;
+	for (int i = 0; i < MAX_NUM_ANIMS; i++) {
+		if (_anims[i].background) {
+			free(_anims[i].background);
+			_anims[i].background = 0;
+		}
 
-		if (_anims[i].reentry == 0) {
+		if (_anims[i].script != 0) {
 			data = _anims[i].script;
 
-			//debug(1, "---Start of anim script---");
 			assert( READ_LE_UINT16(data) == 0xFF86 );
+			data += 4;
+
+			//sceneUnk16[i] = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].unk2 = READ_LE_UINT16(data);
+			data += 4;
+
+			if (_engine->_northExitHeight > READ_LE_UINT16(data))
+				_anims[i].drawY = _engine->_northExitHeight;
+			else
+				_anims[i].drawY = READ_LE_UINT16(data);
+			data += 4;
+
+			//sceneUnk2[i] = READ_LE_UINT16(data);
+			data += 4;
+			
+			_anims[i].x = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].y = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].width = *(data);
+			data += 4;
+			_anims[i].height = *(data);
+			data += 4;
+			_anims[i].sprite = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].flipX = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].width2 = *(data);
+			data += 4;
+			_anims[i].height2 = *(data);
+			data += 4;
+			_anims[i].unk1 = READ_LE_UINT16(data);
+			data += 4;
+			_anims[i].play = READ_LE_UINT16(data);
 			data += 2;
 
-			//debug(1, "Default X of sprite: %i", READ_LE_UINT16(data + 0x12) );
-			_anims[i].x = READ_LE_UINT16(data + 0x12);
-			//debug(1, "Default Y of sprite: %i", READ_LE_UINT16(data + 0x16) );
-			_anims[i].y = READ_LE_UINT16(data + 0x16);
+			_anims[i].script = data;
 
-			//debug(1, "Anim %i flags: 22h: %i, 1ah: %i", i, READ_LE_UINT16(data + 0x22), READ_LE_UINT16(data + 0x1a));
+			int bkgdWidth = _anims[i].width;
+			int bkgdHeight = _anims[i].height;
 
-			/*
-			debug(1, "Anim %i data: 0h: %i, 2h: %i,4h: %i,6h: %i,8h: %i,ah: %i,ch: %i", i, READ_LE_UINT16(data + 0x0),
-			READ_LE_UINT16(data + 0x2), READ_LE_UINT16(data + 0x4),READ_LE_UINT16(data + 0x6),READ_LE_UINT16(data + 0x8),
-			READ_LE_UINT16(data + 0xa),READ_LE_UINT16(data + 0xc));
+			if (_anims[i].width2)
+				bkgdWidth += (_anims[i].width2 >> 3) + 1;
 
-			debug(1, "Anim %i data: eh: %i, 10h: %i,12h: %i,14h: %i,16h: %i,18h: %i,1ah: %i", i, READ_LE_UINT16(data + 0xe),
-			READ_LE_UINT16(data + 0x10), READ_LE_UINT16(data + 0x12),READ_LE_UINT16(data + 0x14),READ_LE_UINT16(data + 0x16),
-			READ_LE_UINT16(data + 0x18),READ_LE_UINT16(data + 0x1a));
+			if (_anims[i].height2)
+				bkgdHeight += _anims[i].height2;
 
-			debug(1, "Anim %i data: 1ch: %i, 1fh: %i,22h: %i,24h: %i,26h: %i,28h: %i,2ah: %i", i, READ_LE_UINT16(data + 0x1c),
-			READ_LE_UINT16(data + 0x1f), READ_LE_UINT16(data + 0x22),READ_LE_UINT16(data + 0x24),READ_LE_UINT16(data + 0x26),
-			READ_LE_UINT16(data + 0x28),READ_LE_UINT16(data + 0x2a));
-			*/
+			_anims[i].background = (uint8 *)malloc(_screen->getRectSize(bkgdWidth + 1, bkgdHeight));
+			//_anims[i].background = (uint8 *)malloc(100*100);
+			assert(_anims[i].background);
+		}
+	}
+}
 
+void Sprites::updateSceneAnims() {
+	debug(9, "Sprites::updateSceneAnims()");
+	uint32 currTime = _system->getMillis();
+	uint8 *data;
+	bool endLoop;
 
-			// TODO: Find out what the rest of this data (next 38h bytes) does.
-			data += 0x38;
+	for (int i = 0; i < MAX_NUM_ANIMS; i++) {
+		if (_anims[i].script == 0 || !_anims[i].play || _anims[i].nextRun != 0 && _anims[i].nextRun > currTime)
+			continue;
+
+		if (_anims[i].reentry == 0) {
+			data = _anims[i].script;
 		} else {
 			data = _anims[i].reentry;
 			_anims[i].reentry = 0;
 		}
 
-		bool endLoop = false;
-		
+		endLoop = false;
 		while (READ_LE_UINT16(data) != 0xFF87 && !endLoop) {
 			uint16 rndNr;
 			uint16 anim;
@@ -142,6 +159,7 @@
 				_anims[i].y = READ_LE_UINT16(data);
 				data += 2;
 				_anims[i].flipX = false;
+				refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1);
 				break;
 			case 0xFF8D:
 				data += 2;
@@ -158,6 +176,7 @@
 				_anims[i].y = READ_LE_UINT16(data);
 				data += 2;
 				_anims[i].flipX = true;
+				refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1);
 				break;
 			case 0xFF8A:
 				data += 2;
@@ -174,7 +193,7 @@
 				data += 2;
 				debug(5, "Maximum time %i", READ_LE_UINT16(data));
 				data += 2;
-				_anims[i].nextRun = _system->getMillis() + rndNr * _animDelay; 								
+				_anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;
 				break;
 			case 0xFF8C:
 				data += 2;
@@ -185,11 +204,13 @@
 				break;
 			case 0xFF99:
 				data += 2;
-				debug(1, "TODO func: Set value of animation property 32h to 1");
+				debug(1, "func: Set value of unknown animation property to 1");
+				_anims[i].unk1 = 1;
 				break;
 			case 0xFF9A:
 				data += 2;
-				debug(1, "TODO func: Set value of animation property 32h to 0");
+				debug(1, "func: Set value of unknown animation property to 0");
+				_anims[i].unk1 = 0;
 				break;		
 			case 0xFF97:
 				data += 2;
@@ -234,6 +255,7 @@
 				_anims[i].sprite = READ_LE_UINT16(data);
 				_anims[i].flipX = false;
 				data += 2;
+				refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1);
 				break;
 			case 0xFF91:
 				data += 2;
@@ -242,6 +264,7 @@
 				_anims[i].sprite = READ_LE_UINT16(data);
 				_anims[i].flipX = true;
 				data += 2;
+				refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1);
 				break;
 			case 0xFF92:
 				data += 2;
@@ -279,8 +302,6 @@
 				data += 2;
 				_anims[anim].play = false;
 				_anims[anim].sprite = -1;
-				//debug(1, "Arg2 %i", READ_LE_UINT16(data));
-				//data += 2;
 				break;
 /*			case 0xFF97:
 				data += 2;
@@ -288,20 +309,23 @@
 				break;*/
 			case 0xFFAD:
 				data += 2;
-				debug(1, "TODO func: Set Brandon's X coordinate");
-				debug(1, "X %i", READ_LE_UINT16(data));
+				debug(5, "func: Set Brandon's X coordinate");
+				debug(5, "X %i", READ_LE_UINT16(data));
+				_engine->_currentCharacter->x1 = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFFAE:
 				data += 2;
-				debug(1, "TODO func: Set Brandon's Y coordinate");
-				debug(1, "Y %i", READ_LE_UINT16(data));
+				debug(5, "func: Set Brandon's Y coordinate");
+				debug(5, "Y %i", READ_LE_UINT16(data));
+				_engine->_currentCharacter->y1 = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFFAF:
 				data += 2;
-				debug(1, "TODO func: Set Brandon's X sprite");
-				debug(1, "Sprite %i", READ_LE_UINT16(data));
+				debug(5, "func: Set Brandon's sprite");
+				debug(5, "Sprite %i", READ_LE_UINT16(data));
+				_engine->_currentCharacter->currentAnimFrame = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFFAA:
@@ -310,28 +334,36 @@
 				break;
 			case 0xFFAB:
 				data += 2;
-				debug(1, "TODO func: Update Brandon's sprite");
+				debug(5, "func: Update Brandon's sprite");
+				_engine->animRefreshNPC(0);
+				_engine->flagAllObjectsForRefresh();
+				_engine->updateAllObjectShapes();
 				break;
 			case 0xFFB0:
 				data += 2;
-				debug(1, "TODO func: Play sound");
-				debug(1, "Sound index %i", READ_LE_UINT16(data));
+				debug(5, "func: Play sound");
+				debug(5, "Sound index %i", READ_LE_UINT16(data));
+				_engine->snd_playSoundEffect(READ_LE_UINT16(data));
 				data += 2;
 				break;
 			case 0xFFB1:
 				data += 2;
-				debug(1, "TODO func: Set unknown global bit");
+				debug(1, "TODO func: Set animator beacon flag");
 				break;
 			case 0xFFB2:
 				data += 2;
-				debug(1, "TODO func: Reset unknown global bit");
+				debug(1, "TODO func: Reset animator beacon flag");
 				break;
 			case 0xFFB4:
 				data += 2;
-				debug(1, "TODO func: Play (at random) a certain sound at a certain percentage of time");
-				debug(1, "Sound index %i", READ_LE_UINT16(data));
+				debug(5, "func: Play (at random) a certain sound at a certain percentage of time");
+				debug(5, "Sound index %i", READ_LE_UINT16(data));
+				int sound = READ_LE_UINT16(data);
 				data += 2;
-				debug(1, "Percentage %i", READ_LE_UINT16(data));
+				debug(5, "Percentage %i", READ_LE_UINT16(data));
+				rndNr = _rnd.getRandomNumber(100);
+				if (rndNr <= READ_LE_UINT16(data))
+					_engine->snd_playSoundEffect(sound);
 				data += 2;
 				break;
 			case 0xFFA7:
@@ -341,7 +373,7 @@
 				data += 2;
 				break;
 			default:
-				debug(1, "Unsupported anim command %X", READ_LE_UINT16(data));
+				debug(1, "Unsupported anim command %X in script %i", READ_LE_UINT16(data), i);
 				//endLoop = true;
 				data += 1;
 				break;
@@ -350,21 +382,19 @@
 
 		if (READ_LE_UINT16(data) == 0xFF87)
 			_anims[i].play = false;
-
-		//debug(1, "---End of anim script---");
 	}
 }
 
-void Sprites::loadDAT(const char *filename) {
+void Sprites::loadDAT(const char *filename, SceneExits &exits) {
 	debug(9, "Sprites::loadDat('%s')", filename);
 	uint32 fileSize;
-	uint8 spritesLoaded = 0;
 
 	delete[] _dat;
+	_spriteDefStart = 0;
 
 	_dat = _res->fileData(filename, &fileSize);
 
-	memset(_anims, 0, sizeof(Anim) * MAX_NUM_ANIMS);
+	memset(_anims, 0, sizeof(_anims));
 	uint8 nextAnim = 0;
 
 	assert(fileSize > 0x6D);
@@ -380,8 +410,6 @@
 	uint16 length = READ_LE_UINT16(data);
 	data += 2;
 
-	//debug(1, "DAT body length: %i, filesize %i, current spot %i", length, fileSize, data - _dat);
-
 	if (length > 2) {
 		assert( length < fileSize);
 		uint8 *animstart;
@@ -440,14 +468,8 @@
 		data += 2;
 	}
 
-	debug(1, "Room DAT file loaded. Found %i sprite and %i animation scripts.", spritesLoaded, nextAnim);
-	
-	//debug(1, "Remainder after script: %i", fileSize - (data - _dat));
 	assert(fileSize - (data - _dat) == 0xC);
 
-	//TODO: Read in character entry coords here
-	SceneExits &exits = _engine->sceneExits();
-
 	exits.northXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2;
 	exits.northYPos = *data++ & 0xFFFE;
 	exits.eastXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2;
@@ -459,9 +481,11 @@
 }
 
 void Sprites::freeSceneShapes() {
-	for (int i = 0; i < ARRAYSIZE(_sceneShapes); i++ )
+	debug(9, "Sprites::freeSceneShapes()");
+	for (int i = 0; i < ARRAYSIZE(_sceneShapes); i++ ) {
 		free(_sceneShapes[i]);
-	
+		_sceneShapes[i] = 0;
+	}
 }
 
 void Sprites::loadSceneShapes() {
@@ -469,11 +493,15 @@
 	uint8 *data = _spriteDefStart;
 	int spriteNum, x, y, width, height;
 
-	assert(_spriteDefStart);
-
 	freeSceneShapes();
 	memset( _sceneShapes, 0, sizeof(_sceneShapes));
 
+	if (_spriteDefStart == 0)
+		return;
+
+	int bakPage = _screen->_curPage;
+	_screen->_curPage = 3;
+
 	while (READ_LE_UINT16(data) != 0xFF85) {
 		spriteNum = READ_LE_UINT16(data);
 		assert(spriteNum < ARRAYSIZE(_sceneShapes));
@@ -486,8 +514,31 @@
 		data += 2;
 		height = READ_LE_UINT16(data);
 		data += 2;
-		_sceneShapes[spriteNum] = _screen->encodeShape(x, y, width, height, 0);
+		_sceneShapes[spriteNum] = _screen->encodeShape(x, y, width, height, 2);
+		debug(9, "Sprite %i is at (%i, %i), width %i, height %i", spriteNum, x, y, width, height);
 	}
+	_screen->_curPage = bakPage;
+}
+
+void Sprites::refreshSceneAnimObject(uint8 animNum, uint8 shapeNum, uint16 x, uint16 y, bool flipX, bool unkFlag) {
+	debug(9, "Sprites::refreshSceneAnimObject(%i, %i, %i, %i, %i, %i", animNum, shapeNum, x, y, flipX, unkFlag);
+	_animObjects[animNum].refreshFlag = 1;
+	_animObjects[animNum].bkgdChangeFlag = 1;
+
+	if (unkFlag)
+		_animObjects[animNum].flags |= 0x0200;
+	else
+		_animObjects[animNum].flags &= 0xFD00;
+
+	if (flipX)
+		_animObjects[animNum].flags |= 1;
+	else
+		_animObjects[animNum].flags &= 0xFE;
+
+	_animObjects[animNum].sceneAnimPtr = _sceneShapes[shapeNum];
+	_animObjects[animNum].animFrameNumber = -1;
+	_animObjects[animNum].x1 = x;
+	_animObjects[animNum].y1 = y;
 }
 
 } // end of namespace Kyra

Index: sprites.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/sprites.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- sprites.h	29 Oct 2005 18:37:40 -0000	1.4
+++ sprites.h	10 Nov 2005 14:08:50 -0000	1.5
@@ -45,6 +45,14 @@
 	uint8 *reentry;
 	uint32 nextRun;
 	bool play;
+	uint16 width;
+	uint16 height;
+	uint16 width2;
+	uint16 height2;
+	uint16 unk1;
+	uint16 drawY;
+	uint16 unk2;
+	uint8 *background;
 };
 
 class Sprites {
@@ -53,14 +61,16 @@
 	Sprites(KyraEngine *engine, OSystem *system);
 	~Sprites();
 
-	void doAnims();
-	void loadDAT(const char *filename);
-	uint8 *getSceneShape(uint8 sceneShapeID);
-	void drawSprites(uint8 srcPage, uint8 dstPage);
+	void updateSceneAnims();
+	void setupSceneAnims();
+	void loadDAT(const char *filename, SceneExits &exits);
 	void loadSceneShapes();
 	
-	void enableAnim(uint8 anim) { _anims[anim].play = true; }
-	void disableAnim(uint8 anim) { _anims[anim].play = false; }
+	Anim _anims[MAX_NUM_ANIMS];
+	AnimObject *_animObjects;
+	uint8 *_sceneShapes[50];
+
+	void refreshSceneAnimObject(uint8 animNum, uint8 shapeNum, uint16 x, uint16 y, bool flipX, bool unkFlag);
 
 protected:
 	void freeSceneShapes();
@@ -69,9 +79,7 @@
 	Resource *_res;
 	OSystem *_system;
 	Screen *_screen;
-	uint8 *_sceneShapes[50];
 	uint8 *_dat;
-	Anim _anims[MAX_NUM_ANIMS];
 	Common::RandomSource _rnd;
 	uint8 _animDelay;
 	uint8 *_spriteDefStart;





More information about the Scummvm-git-logs mailing list