[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.95,1.96 kyra.h,1.53,1.54 screen.h,1.18,1.19 script_v1.cpp,1.48,1.49 sprites.cpp,1.14,1.15 staticres.cpp,1.27,1.28

Johannes Schickel lordhoto at users.sourceforge.net
Sat Dec 24 10:02:01 CET 2005


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

Modified Files:
	kyra.cpp kyra.h screen.h script_v1.cpp sprites.cpp 
	staticres.cpp 
Log Message:
Started to implement button handling (atm only the inventory works)
Also implemented following opcodes:
 - cmd_waitForConfirmationMouseClick
 - cmd_drawItemShapeIntoScene
 - cmd_setFireberryGlowPalette
 - cmd_findBrightestFireberry
 - cmd_sceneToDirection
 - cmd_createAmuletJewel
 - cmd_getCharactersMovementDelay
 - cmd_setNoDrawShapesFlag
 - cmd_checkClickOnNPC
 - cmd_getFoyerItem
 - cmd_setFoyerItem
 - cmd_passiveProtection
 - cmd_fillRect
Fixed bugs in some opcodes (mostly wrong debug calls)
Also changed debuglevel of all sprite functions to level 6 (from 5).


Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -d -r1.95 -r1.96
--- kyra.cpp	23 Dec 2005 17:49:11 -0000	1.95
+++ kyra.cpp	24 Dec 2005 18:00:35 -0000	1.96
@@ -282,6 +282,7 @@
 	assert(_characterList);
 	for (int i = 0; i < 11; ++i) {
 		memset(&_characterList[i], 0, sizeof(Character));
+		memset(_characterList[i].inventoryItems, 0xFF, sizeof(_characterList[i].inventoryItems));
 	}
 	_characterList[0].sceneId = 5;
 	_characterList[0].height = 48;
@@ -339,6 +340,7 @@
 	memset(_currSentenceColor, 0, 3);
 	_startSentencePalIndex = -1;
 	_fadeText = false;
+	_noDrawShapesFlag = 0;
 
 	_brandonPosX = _brandonPosY = -1;
 	_brandonDrawFrame = 113;
@@ -358,6 +360,7 @@
 	_configTalkspeed = 1;
 	
 	_marbleVaseItem = -1;
+	memset(_foyerItemTable, -1, sizeof(_foyerItemTable));
 	_mouseState = _itemInHand = -1;
 	_handleInput = false;
 	
@@ -373,6 +376,7 @@
 	_unkScreenVar3 = 0;
 	
 	memset(_specialPalettes, 0, sizeof(_specialPalettes));
+	_mousePressFlag = false;
 
 	return 0;
 }
@@ -398,6 +402,13 @@
 	
 	delete [] _movFacingTable;
 	
+	free(_buttonShape0);
+	free(_buttonShape1);
+	free(_buttonShape2);
+	free(_buttonShape3);
+	free(_buttonShape4);
+	free(_buttonShape5);
+	
 	for (int i = 0; i < ARRAYSIZE(_shapes); ++i) {
 		if (_shapes[i] != 0) {
 			free(_shapes[i]);
@@ -492,6 +503,8 @@
 	loadCharacterShapes();
 	loadSpecialEffectShapes();
 	loadItems();
+	loadButtonShapes();
+	initMainButtonList();
 	loadMainScreen();
 	setupTimers();
 	loadPalette("PALETTE.COL", _screen->_currentPalette);
@@ -528,6 +541,7 @@
 	OSystem::Event event;
 	char saveLoadSlot[20];
 
+	_mousePressFlag = false;
 	uint32 start = _system->getMillis();
 	do {
 		while (_system->pollEvent(event)) {
@@ -556,6 +570,7 @@
 				quitGame();
 				break;
 			case OSystem::EVENT_LBUTTONDOWN:
+				_mousePressFlag = true;
 				if (_abortWalkFlag2) {
 					_abortWalkFlag = true;
 					_mouseX = event.mouse.x;
@@ -627,6 +642,7 @@
 
 	while (!_quitFlag) {
 		int32 frameTime = (int32)_system->getMillis();
+		processButtonList(_buttonList);
 		updateMousePointer();
 		updateGameTimers();
 		_sprites->updateSceneAnims();
@@ -718,6 +734,18 @@
 	} while (!_fastMode && _system->getMillis() < end);
 }
 
+void KyraEngine::delayWithTicks(int ticks) {
+	uint32 nextTime = _system->getMillis() + ticks * _tickLength;
+	while (_system->getMillis() < nextTime) {
+		_sprites->updateSceneAnims();
+		updateAllObjectShapes();
+		//if (_currentCharacter->sceneId == 210) {
+		//	updateKyragemFading();
+		//	seq_playEnd();
+		//}
+	}
+}
+
 void KyraEngine::seq_demo() {
 	debug(9, "KyraEngine::seq_demo()");
 
@@ -893,6 +921,66 @@
 	_seq->playSequence(_seq_KallakMalcolm, true);
 }
 
+void KyraEngine::seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly) {
+	debug(9, "seq_createAmuletJewel(%d, %d, %d, %d)", jewel, page, noSound, drawOnly);
+	const static uint16 specialJewelTable[] = {
+		0x167, 0x162, 0x15D, 0x158, 0x153, 0xFFFF
+	};
+	const static uint16 specialJewelTable1[] = {
+		0x14F, 0x154, 0x159, 0x15E, 0x163, 0xFFFF
+	};
+	const static uint16 specialJewelTable2[] = {
+		0x150, 0x155, 0x15A, 0x15F, 0x164, 0xFFFF
+	};
+	const static uint16 specialJewelTable3[] = {
+		0x151, 0x156, 0x15B, 0x160, 0x165, 0xFFFF
+	};
+	const static uint16 specialJewelTable4[] = {
+		0x152, 0x157, 0x15C, 0x161, 0x166, 0xFFFF
+	};
+	if (!noSound)
+		// snd_playSoundEffect(0x5F)
+	_screen->hideMouse();
+	if (!drawOnly) {
+		for (int i = 0; specialJewelTable[i] != 0xFFFF; ++i) {
+			_screen->drawShape(page, _shapes[4+specialJewelTable[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
+			_screen->updateScreen();
+			delayWithTicks(3);
+		}
+		
+		const uint16 *opcodes = 0;
+		switch (jewel - 1) {
+			case 0:
+				opcodes = specialJewelTable1;
+				break;
+				
+			case 1:
+				opcodes = specialJewelTable2;
+				break;
+				
+			case 2:
+				opcodes = specialJewelTable3;
+				break;
+				
+			case 3:
+				opcodes = specialJewelTable4;
+				break;
+		}
+		
+		if (opcodes) {
+			for (int i = 0; opcodes[i] != 0xFFFF; ++i) {
+				_screen->drawShape(page, _shapes[4+opcodes[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
+				_screen->updateScreen();
+				delayWithTicks(3);
+			}
+		}
+	}
+	_screen->drawShape(page, _shapes[327+jewel], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
+	_screen->updateScreen();
+	_screen->showMouse();
+	setGameFlag(0x55+jewel);
+}
+
 bool KyraEngine::seq_skipSequence() const {
 	debug(9, "KyraEngine::seq_skipSequence()");
 	return _quitFlag || _abortIntroFlag;
@@ -1080,6 +1168,25 @@
 	delete[] fileData;
 }
 
+void KyraEngine::loadButtonShapes() {
+	loadBitmap("BUTTONS2.CPS", 3, 3, 0);
+	_screen->_curPage = 2;
+	_buttonShape0 = _screen->encodeShape(0, 0, 24, 14, 1);
+	_buttonShape1 = _screen->encodeShape(24, 0, 24, 14, 1);
+	_buttonShape2 = _screen->encodeShape(48, 0, 24, 14, 1);
+	_buttonShape3 = _screen->encodeShape(0, 15, 24, 14, 1);
+	_buttonShape4 = _screen->encodeShape(24, 15, 24, 14, 1);
+	_buttonShape5 = _screen->encodeShape(48, 15, 24, 14, 1);
+	_screen->_curPage = 0;
+}
+
+void KyraEngine::initMainButtonList() {
+	_buttonList = &_buttonData[0];
+	for (int i = 0; _buttonDataListPtr[i]; ++i) {
+		_buttonList = initButton(_buttonList, _buttonDataListPtr[i]);
+	}
+}
+
 void KyraEngine::loadMainScreen() {
 	if ((_features & GF_ENGLISH) && (_features & GF_TALKIE)) 
 		loadBitmap("MAIN_ENG.CPS", 3, 3, 0);
@@ -1177,6 +1284,8 @@
 	debug(9, "enterNewScene(%d, %d, %d, %d, %d)", sceneId, facing, unk1, unk2, brandonAlive);
 	int unkVar1 = 1;
 	_screen->hideMouse();
+	_handleInput = false;
+	_abortWalkFlag = false;
 	_abortWalkFlag2 = false;
 	if (_currentCharacter->sceneId == 7 && sceneId == 24) {
 		_newMusicTheme = 2;
@@ -1336,8 +1445,9 @@
 	_screen->showMouse();
 	if (!brandonAlive) {
 		// XXX seq_poisionDeathNow
-	}	
+	}
 	updateMousePointer(true);
+	_changedScene = true;
 }
 
 void KyraEngine::transcendScenes(int roomIndex, int roomName) {
@@ -2786,12 +2896,12 @@
 	while (height >= 0) {
 		restoreRect1(xpos, ypos);
 		_screen->setNewShapeHeight(_shapes[220+_itemInHand], height);
+		uint32 nextTime = _system->getMillis() + 1 * _tickLength;
 		_screen->drawShape(0, _shapes[220+_itemInHand], xpos, y, 0, 0);
 		_screen->updateScreen();
 		y += 2;
 		height -= 2;
-		// XXX
-		waitTicks(1);
+		while (_system->getMillis() < nextTime) {}
 	}	
 	restoreRect1(xpos, ypos);
 	_screen->resetShapeHeight(_shapes[220+_itemInHand]);
@@ -3579,7 +3689,8 @@
 	AnimObject *curObject = _objectQueue;
 	int drawPage = 2;
 	int flagUnk1 = 0, flagUnk2 = 0, flagUnk3 = 0;
-	// XXX
+	if (_noDrawShapesFlag)
+		return;
 	if (_brandonStatusBit & 0x20)
 		flagUnk1 = 0x200;
 	if (_brandonStatusBit & 0x40)
@@ -4583,6 +4694,7 @@
 	int returnValue = 0;
 	uint32 nextFrame = 0;
 	_abortWalkFlag = false;
+	_mousePressFlag = false;
 	while (running) {
 		if (_abortWalkFlag) {
 			*table = 8;
@@ -4611,14 +4723,17 @@
 				break;
 		}
 		
-		returnValue = (changeScene(_currentCharacter->facing) != 0);
+		returnValue = changeScene(_currentCharacter->facing);
 		if (returnValue) {
 			running = false;
+			_abortWalkFlag = false;
 		}
 		
 		if (unk1) {
-			// XXX running = false;
-			_sceneChangeState = 1;
+			if (_mousePressFlag) {
+				running = false;
+				_sceneChangeState = 1;
+			}
 		}
 		
 		if (forceContinue || !running) {
@@ -5030,7 +5145,9 @@
 	}
 	uint8 item = findItemAtPos(xpos, ypos);
 	if (item == 0xFF) {
-		if (clickEventHandler(xpos, ypos))
+		_changedScene = false;
+		clickEventHandler(xpos, ypos);
+		if (_changedScene)
 			return;
 	} 
 	
@@ -5114,10 +5231,11 @@
 	_scriptClick->variables[3] = 0;
 	_scriptClick->variables[4] = _itemInHand;
 	_scriptInterpreter->startScript(_scriptClick, 1);
-	
+
 	while (_scriptInterpreter->validScript(_scriptClick)) {
 		_scriptInterpreter->runScript(_scriptClick);
 	}
+
 	return _scriptClick->variables[3];
 }
 
@@ -5479,4 +5597,177 @@
 	delete out;
 }
 
+#pragma mark -
+#pragma mark - Button handling
+#pragma mark -
+
+Button *KyraEngine::initButton(Button *list, Button *newButton) {
+	if (!newButton)
+		return list;
+	if (!list)
+		return newButton;
+	Button *cur = list;
+	while (true) {
+		if (!cur->nextButton) {
+			break;
+		}
+		cur = cur->nextButton;
+	}
+	cur->nextButton = newButton;
+	return list;
+}
+
+int KyraEngine::buttonInventoryCallback(Button *caller) {
+	int itemOffset = caller->specialValue - 2;
+	uint8 inventoryItem = _currentCharacter->inventoryItems[itemOffset];
+	if (_itemInHand == -1) {
+		if (inventoryItem == 0xFF) {
+			// snd_playSoundEffect(0x36);
+			return 0;
+		} else {
+			_screen->hideMouse();
+			_screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12);
+			// snd_playSoundEffect(0x35);
+			setMouseItem(inventoryItem);
+			updateSentenceCommand(_itemList[inventoryItem], _takenList[0], 179);
+			_itemInHand = inventoryItem;
+			_screen->showMouse();
+			_currentCharacter->inventoryItems[itemOffset] = 0xFF;
+		}
+	} else {
+		if (inventoryItem != 0xFF) {
+			// snd_playSoundEffect(0x35);
+			_screen->hideMouse();
+			_screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12);
+			_screen->drawShape(0, _shapes[220+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0);
+			setMouseItem(inventoryItem);
+			updateSentenceCommand(_itemList[inventoryItem], _takenList[1], 179);
+			_screen->showMouse();
+			_currentCharacter->inventoryItems[itemOffset] = _itemInHand;
+			_itemInHand = inventoryItem;
+		} else {
+			// snd_playSoundEffect(0x32);
+			_screen->hideMouse();
+			_screen->drawShape(0, _shapes[220+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0);
+			_screen->setMouseCursor(1, 1, _shapes[4]);
+			updateSentenceCommand(_itemList[_itemInHand], _placedList[0], 179);
+			_screen->showMouse();
+			_currentCharacter->inventoryItems[itemOffset] = _itemInHand;
+			_itemInHand = -1;
+		}
+	}
+	_screen->updateScreen();
+	// XXX clearKyrandiaButtonIO
+	return 0;
+}
+
+void KyraEngine::processButtonList(Button *list) {
+	while (list) {
+		if (list->flags & 8) {
+			list = list->nextButton;
+			continue;
+		}
+		
+		int x = list->x;
+		int y = list->y;
+		assert(list->dimTableIndex < _screen->_screenDimTableCount);
+		if (x < 0) {
+			x += _screen->_screenDimTable[list->dimTableIndex].w << 3;
+		}
+		x += _screen->_screenDimTable[list->dimTableIndex].sx << 3;
+		
+		if (y < 0) {
+			y += _screen->_screenDimTable[list->dimTableIndex].h;
+		}
+		y += _screen->_screenDimTable[list->dimTableIndex].sy;
+		
+		if (_mouseX >= x && _mouseY >= y && x + list->width >= _mouseX && y + list->height >= _mouseY) {
+			int processMouseClick = 0;
+			if (list->flags & 0x400) {
+				if (_mousePressFlag) {
+					if (!(list->flags2 & 1)) {
+						list->flags2 |= 1;
+						processButton(list);
+					}
+				} else {
+					if (list->flags2 & 1) {
+						list->flags2 &= 0xFFFE;
+						processButton(list);
+						processMouseClick = 1;
+					}
+				}
+			} else if (_mousePressFlag) {
+				processMouseClick = 1;
+			}
+				
+			if (processMouseClick) {
+				if (list->buttonCallback) {
+					if ((this->*(list->buttonCallback))(list)) {
+						break;
+					}
+				}
+			}
+		} else {
+			if (list->flags2 & 1) {
+				list->flags2 &= 0xFFFE;
+				processButton(list);
+			}
+			list = list->nextButton;
+			continue;
+		}
+		
+		list = list->nextButton;
+	}
+}
+
+void KyraEngine::processButton(Button *button) {
+	if (!button)
+		return;
+		
+	int processType = 0;
+	uint8 *shape = 0;
+	Button::ButtonCallback callback = 0;
+	
+	int flags = (button->flags2 & 5);
+	if (flags == 1) {
+		processType = button->process2;
+		if (processType == 1) {
+			shape = button->process2PtrShape;
+		} else if (processType == 4) {
+			callback = button->process2PtrCallback;
+		}
+	} else if (flags == 4 || flags == 5) {
+		processType = button->process1;
+		if (processType == 1) {
+			shape = button->process1PtrShape;
+		} else if (processType == 4) {
+			callback = button->process1PtrCallback;
+		}
+	} else {
+		processType = button->process0;
+		if (processType == 1) {
+			shape = button->process0PtrShape;
+		} else if (processType == 4) {
+			callback = button->process0PtrCallback;
+		}
+	}
+	
+	int x = button->x;
+	int y = button->y;
+	assert(button->dimTableIndex < _screen->_screenDimTableCount);
+	if (x < 0) {
+		x += _screen->_screenDimTable[button->dimTableIndex].w << 3;
+	}
+	
+	if (y < 0) {
+		y += _screen->_screenDimTable[button->dimTableIndex].h;
+	}
+	
+	if (processType == 1 && shape) {
+		_screen->drawShape(_screen->_curPage, shape, x, y, button->dimTableIndex, 0x10);
+	} else if (processType == 4 && callback) {
+		(this->*callback)(button);
+	}
+}
+
 } // End of namespace Kyra

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- kyra.h	23 Dec 2005 17:49:14 -0000	1.53
+++ kyra.h	24 Dec 2005 18:00:35 -0000	1.54
@@ -152,6 +152,34 @@
 	void (KyraEngine::*func)(int timerNum);
 };
 
+struct Button {
+	Button *nextButton;
+	uint16 specialValue;
+	// uint8 unk[4];
+	uint8 process0;
+	uint8 process1;
+	uint8 process2;
+	// uint8 unk
+	uint16 flags;
+	typedef int (KyraEngine::*ButtonCallback)(Button*);
+	// using 6 pointers instead of 3 as in the orignal here (safer for use with classes)
+	uint8 *process0PtrShape;
+	uint8 *process1PtrShape;
+	uint8 *process2PtrShape;
+	ButtonCallback process0PtrCallback;
+	ButtonCallback process1PtrCallback;
+	ButtonCallback process2PtrCallback;
+	uint16 dimTableIndex;
+	uint16 x;
+	uint16 y;
+	uint16 width;
+	uint16 height;
+	// uint8 unk[8];
+	uint32 flags2;
+	ButtonCallback buttonCallback;
+	// uint8 unk[8];
+};
+
 class KyraEngine : public Engine {
 	friend class MusicPlayer;
 	friend class Debugger;
@@ -225,6 +253,7 @@
 	void wsa_play(WSAMovieV1 *wsa, int frameNum, int x, int y, int pageNum);
 
 	void waitTicks(int ticks);
+	void delayWithTicks(int ticks);
 	void updateAllObjectShapes();
 	void flagAllObjectsForRefresh();
 	void animRefreshNPC(int character);
@@ -520,6 +549,7 @@
 	void seq_introMalcolmTree();
 	void seq_introKallakWriting();
 	void seq_introKallakMalcolm();
+	void seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly);
 
 	void wsa_processFrame(WSAMovieV1 *wsa, int frameNum, uint8 *dst);
 
@@ -550,6 +580,8 @@
 	void loadCharacterShapes();
 	void loadSpecialEffectShapes();
 	void loadItems();
+	void loadButtonShapes();
+	void initMainButtonList();
 	void loadMainScreen();
 	void setCharactersInDefaultScene();
 	void resetBrandonPosionFlags();
@@ -567,6 +599,12 @@
 	void timerFadeText(int timerNum);
 	void drawAmulet();
 	void setTextFadeTimerCountdown(int16 countdown);
+	
+	int buttonInventoryCallback(Button *caller);
+	Button *initButton(Button *list, Button *newButton);
+	void processButtonList(Button *list);
+	void processButton(Button *button);
+	
 	uint8 _game;
 	bool _fastMode;
 	bool _quitFlag;
@@ -574,6 +612,7 @@
 	bool _abortIntroFlag;
 	bool _abortWalkFlag;
 	bool _abortWalkFlag2;
+	bool _mousePressFlag;
 	char _talkBuffer[300];
 	char _talkSubstrings[TALK_SUBSTRING_LEN * TALK_SUBSTRING_NUM];
 	TalkCoords _talkCoords;
@@ -592,7 +631,9 @@
 	int _mouseState;
 	bool _handleInput;
 	bool _updateScreen;
+	bool _changedScene;
 	int _unkScreenVar1, _unkScreenVar2, _unkScreenVar3;
+	int _noDrawShapesFlag;
 
 	WSAMovieV1 *_wsaObjects[10];
 	uint16 _entranceMouseCursorTracks[8];
@@ -610,6 +651,7 @@
 	uint8 _idolGemsTable[3];
 	
 	int16 _marbleVaseItem;
+	int16 _foyerItemTable[3];
 	
 	uint16 _brandonStatusBit;
 	uint8 _unkBrandonPoisonFlags[256];	// this seem not to be posion flags, it is used for drawing once
@@ -680,6 +722,15 @@
 	
 	Character *_characterList;
 	
+	Button *_buttonList;
+	
+	uint8 *_buttonShape0;
+	uint8 *_buttonShape1;
+	uint8 *_buttonShape2;
+	uint8 *_buttonShape3;
+	uint8 *_buttonShape4;
+	uint8 *_buttonShape5;
+	
 	uint8 *_seq_Forest;
 	uint8 *_seq_KallakWriting;
 	uint8 *_seq_KyrandiaLogo;
@@ -739,8 +790,11 @@
 	static const int8 _addYPosTable[];
 
 	// positions of the inventory
-	static const int16 _itemPosX[];
-	static const int8 _itemPosY[];
+	static const uint16 _itemPosX[];
+	static const uint8 _itemPosY[];
+	
+	static Button _buttonData[];
+	static Button *_buttonDataListPtr[];
 
 	static const uint8 _magicMouseItemStartFrame[];
 	static const uint8 _magicMouseItemEndFrame[];
@@ -749,6 +803,8 @@
 
 	static const uint16 _amuletX[];
 	static const uint16 _amuletY[];
+	static const uint16 _amuletX2[];
+	static const uint16 _amuletY2[];
 };
 
 } // End of namespace Kyra

Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- screen.h	22 Dec 2005 18:14:52 -0000	1.18
+++ screen.h	24 Dec 2005 18:00:35 -0000	1.19
@@ -138,6 +138,8 @@
 	uint8 *_currentPalette;
 	uint8 *_shapePages[2];
 
+	static const ScreenDim _screenDimTable[];
+	static const int _screenDimTableCount;
 private:
 	int16 encodeShapeAndCalculateSize(uint8 *from, uint8 *to, int size);
 	void restoreMouseRect();
@@ -160,9 +162,6 @@
 
 	OSystem *_system;
 	KyraEngine *_vm;
-	
-	static const ScreenDim _screenDimTable[];
-	static const int _screenDimTableCount;
 };
 
 } // End of namespace Kyra

Index: script_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/script_v1.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- script_v1.cpp	23 Dec 2005 17:49:14 -0000	1.48
+++ script_v1.cpp	24 Dec 2005 18:00:35 -0000	1.49
@@ -402,6 +402,11 @@
 	if (reinitScript) {
 		_scriptInterpreter->initScript(script, script->dataPtr);
 	}
+
+	if (_sceneChangeState) {
+		_sceneChangeState = 0;
+		return 1;
+	}
 	return 0;
 }
 
@@ -450,7 +455,7 @@
 }
 
 int KyraEngine::cmd_createMouseItem(ScriptState *script) {
-	debug(3, "cmd_createMouseItem(0x%X) (%d)", stackPos(0));
+	debug(3, "cmd_createMouseItem(0x%X) (%d)", script, stackPos(0));
 	createMouseItem(stackPos(0));
 	return 0;
 }
@@ -473,7 +478,7 @@
 }
 
 int KyraEngine::cmd_getElapsedSeconds(ScriptState *script) {
-	debug(3, "cmd_getElapsedSeconds(0x%X) ()");
+	debug(3, "cmd_getElapsedSeconds(0x%X) ()", script);
 	return _system->getMillis() / 1000;
 }
 
@@ -531,25 +536,50 @@
 }
 
 int KyraEngine::cmd_setScenePhasingFlag(ScriptState *script) {
-	debug(3, "cmd_setScenePhasingFlag(0x%X) ()");
+	debug(3, "cmd_setScenePhasingFlag(0x%X) ()", script);
 	_scenePhasingFlag = 1;
 	return 1;
 }
 
 int KyraEngine::cmd_resetScenePhasingFlag(ScriptState *script) {
-	debug(3, "cmd_resetScenePhasingFlag(0x%X) ()");
+	debug(3, "cmd_resetScenePhasingFlag(0x%X) ()", script);
 	_scenePhasingFlag = 0;
 	return 0;
 }
 
 int KyraEngine::cmd_queryScenePhasingFlag(ScriptState *script) {
-	debug(3, "cmd_queryScenePhasingFlag(0x%X) ()");
+	debug(3, "cmd_queryScenePhasingFlag(0x%X) ()", script);
 	return _scenePhasingFlag;
 }
 
 int KyraEngine::cmd_sceneToDirection(ScriptState *script) {
-	warning("STUB: cmd_sceneToDirection");
-	return 0;
+	debug(3, "cmd_sceneToDirection(0x%X) (%d, %d)", script, stackPos(0), stackPos(1));
+	assert(stackPos(0) < _roomTableSize);
+	Room *curRoom = &_roomTable[stackPos(0)];
+	uint16 returnValue = 0xFFFF;
+	switch (stackPos(1)) {
+		case 0:
+			returnValue = curRoom->northExit;
+			break;
+		
+		case 2:
+			returnValue = curRoom->eastExit;
+			break;
+		
+		case 4:
+			returnValue = curRoom->southExit;
+			break;
+		
+		case 6:
+			returnValue = curRoom->westExit;
+			break;
+		
+		default:
+			break;
+	}
+	if (returnValue == 0xFFFF)
+		return -1;
+	return returnValue;
 }
 
 int KyraEngine::cmd_setBirthstoneGem(ScriptState *script) {
@@ -943,20 +973,22 @@
 				while (_system->getMillis() < continueTime) {
 					_sprites->updateSceneAnims();
 					updateAllObjectShapes();
-					delay(10);
+					if (continueTime - _system->getMillis() >= 10)
+						delay(10);
 				}
 				++frame;
 			}
 		} else {
-			int frame = endFrame;
-			while (startFrame <= frame) {
+			int frame = startFrame;
+			while (endFrame <= frame) {
 				wsa_play(_wsaObjects[wsaIndex], frame, xpos, ypos, 0);
 				_updateScreen = true;
 				uint32 continueTime = waitTime * _tickLength + _system->getMillis();
 				while (_system->getMillis() < continueTime) {
 					_sprites->updateSceneAnims();
 					updateAllObjectShapes();
-					delay(10);
+					if (continueTime - _system->getMillis() >= 10)
+						delay(10);
 				}
 				--frame;
 			}
@@ -1008,18 +1040,18 @@
 }
 
 int KyraEngine::cmd_clearSceneAnimatorBeacon(ScriptState *script) {
-	debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()");
+	debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()", script);
 	_sprites->_sceneAnimatorBeaconFlag = 0;
 	return 0;
 }
 
 int KyraEngine::cmd_querySceneAnimatorBeacon(ScriptState *script) {
-	debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()");
+	debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()", script);
 	return _sprites->_sceneAnimatorBeaconFlag;
 }
 
 int KyraEngine::cmd_refreshSceneAnimator(ScriptState *script) {
-	debug(3, "cmd_refreshSceneAnimator(0x%X) ()");
+	debug(3, "cmd_refreshSceneAnimator(0x%X) ()", script);
 	_sprites->updateSceneAnims();
 	updateAllObjectShapes();
 	return 0;
@@ -1071,7 +1103,7 @@
 }
 
 int KyraEngine::cmd_getKey(ScriptState *script) {
-	debug(3, "cmd_getKey(0x%X) ()");
+	debug(3, "cmd_getKey(0x%X) ()", script);
 	waitForEvent();
 	return 0;
 }
@@ -1314,12 +1346,83 @@
 }
 
 int KyraEngine::cmd_findBrightestFireberry(ScriptState *script) {
-	warning("STUB: cmd_findBrightestFireberry");
-	return 0;
+	debug(3, "cmd_findBrightestFireberry(0x%X) ()", script);
+	if (_currentCharacter->sceneId >= 187 && _currentCharacter->sceneId <= 198) {
+		return 29;
+	}
+	if (_currentCharacter->sceneId == 133 || _currentCharacter->sceneId == 137 ||
+		_currentCharacter->sceneId == 165 || _currentCharacter->sceneId == 173) {
+		return 29;
+	}
+	if (_itemInHand == 28)
+		return 28;
+	int brightestFireberry = 107;
+	if (_itemInHand >= 29 && _itemInHand <= 33)
+		brightestFireberry = _itemInHand;
+	for (int i = 0; i < 10; ++i) {
+		uint8 item = _currentCharacter->inventoryItems[i];
+		if (item == 0xFF)
+			continue;
+		if (item == 28)
+			return 28;
+		if (item >= 29 && item <= 33) {
+			if (item < brightestFireberry)
+				brightestFireberry = item;
+		}
+	}
+	assert(_currentCharacter->sceneId < _roomTableSize);
+	Room *curRoom = &_roomTable[_currentCharacter->sceneId];
+	for (int i = 0; i < 12; ++i) {
+		uint8 item = curRoom->itemsTable[i];
+		if (item == 0xFF)
+			continue;
+		if (item == 28)
+			return 28;
+		if (item >= 29 && item <= 33) {
+			if (item < brightestFireberry)
+				brightestFireberry = item;
+		}
+	}
+	if (brightestFireberry == 107)
+		return -1;
+	return brightestFireberry;
 }
 
 int KyraEngine::cmd_setFireberryGlowPalette(ScriptState *script) {
-	warning("STUB: cmd_setFireberryGlowPalette");
+	debug(3, "cmd_setFireberryGlowPalette(0x%X) (%d)", script, stackPos(0));
+	int palIndex = 0;
+	switch (stackPos(0)) {
+		case 0x1E:
+			palIndex = 9;
+			break;
+			
+		case 0x1F:
+			palIndex = 10;
+			break;
+		
+		case 0x20:
+			palIndex = 11;
+			break;
+		
+		case 0x21:
+		case -1:
+			palIndex = 12;
+			break;
+			
+		default:
+			palIndex = 8;
+			break;
+	}
+	if (_brandonStatusBit & 2) {
+		if (_currentCharacter->sceneId != 133 && _currentCharacter->sceneId != 137 &&
+			_currentCharacter->sceneId != 165 && _currentCharacter->sceneId != 173 &&
+			(_currentCharacter->sceneId < 187 || _currentCharacter->sceneId > 198)) {
+			palIndex = 14;
+		}
+	}
+	uint8 *palette = _specialPalettes[palIndex];
+	memcpy(&_screen->_currentPalette[684], palette, 44);
+	_screen->setScreenPalette(_screen->_currentPalette);
 	return 0;
 }
 
@@ -1373,7 +1476,26 @@
 }
 
 int KyraEngine::cmd_drawItemShapeIntoScene(ScriptState *script) {
-	warning("STUB: cmd_drawItemShapeIntoScene");
+	debug(3, "cmd_drawItemShapeIntoScene(0x%X) (%d, %d, %d, %d, %d)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	int item = stackPos(0);
+	int x = stackPos(1);
+	int y = stackPos(2);
+	int flags = stackPos(3);
+	int onlyHidPage = stackPos(4);
+	if (flags)
+		flags = 1;
+	if (onlyHidPage) {
+		_screen->drawShape(2, _shapes[220+item], x, y, 0, flags);
+	} else {
+		_screen->hideMouse();
+		restoreAllObjectBackgrounds();
+		_screen->drawShape(2, _shapes[220+item], x, y, 0, flags);
+		_screen->drawShape(0, _shapes[220+item], x, y, 0, flags);
+		flagAllObjectsForBkgdChange();
+		flagAllObjectsForRefresh();
+		updateAllObjectShapes();
+		_screen->showMouse();
+	}
 	return 0;
 }
 
@@ -1384,7 +1506,25 @@
 }
 
 int KyraEngine::cmd_waitForConfirmationMouseClick(ScriptState *script) {
-	warning("STUB: cmd_waitForConfirmationMouseClick");
+	debug(3, "cmd_waitForConfirmationMouseClick(0x%X) ()", script);
+	// if (mouseEnabled) {
+	while (!_mousePressFlag) {
+		updateMousePointer();
+		_sprites->updateSceneAnims();
+		updateAllObjectShapes();
+		delay(10);
+	}
+	
+	while (_mousePressFlag) {
+		updateMousePointer();
+		_sprites->updateSceneAnims();
+		updateAllObjectShapes();
+		delay(10);
+	}
+	// }
+	// XXX processButtonList calls
+	script->variables[1] = _mouseX;
+	script->variables[2] = _mouseY;
 	return 0;
 }
 
@@ -1426,7 +1566,8 @@
 }
 
 int KyraEngine::cmd_createAmuletJewel(ScriptState *script) {
-	warning("STUB: cmd_createAmuletJewel");
+	debug(3, "cmd_createAmuletJewel(0x%X) (%d)", script, stackPos(0));
+	seq_createAmuletJewel(stackPos(0), 0, 0, 0);
 	return 0;
 }
 
@@ -1448,8 +1589,8 @@
 }
 
 int KyraEngine::cmd_getCharactersMovementDelay(ScriptState *script) {
-	warning("STUB: cmd_getCharactersMovementDelay");
-	return 0;
+	debug(3, "cmd_getCharactersMovementDelay(0x%X) (%d)", script, stackPos(0));
+	return getTimerDelay(stackPos(0)+5);
 }
 
 int KyraEngine::cmd_getBirthstoneGem(ScriptState *script) {
@@ -1526,7 +1667,8 @@
 }
 
 int KyraEngine::cmd_setNoDrawShapesFlag(ScriptState *script) {
-	warning("STUB: cmd_setNoDrawShapesFlag");
+	debug(3, "cmd_setNoDrawShapesFlag(0x%X) (%d)", script, stackPos(0));
+	_noDrawShapesFlag = stackPos(0);
 	return 0;
 }
 
@@ -1608,18 +1750,21 @@
 }
 
 int KyraEngine::cmd_checkClickOnNPC(ScriptState *script) {
-	warning("STUB: cmd_checkClickOnNPC");
-	return 0;
+	debug(3, "cmd_checkClickOnNPC(0x%X) (%d, %d)", script, stackPos(0), stackPos(1));
+	return checkForNPCScriptRun(stackPos(0), stackPos(1));
 }
 
 int KyraEngine::cmd_getFoyerItem(ScriptState *script) {
-	warning("STUB: cmd_getFoyerItem");
-	return 0;
+	debug(3, "cmd_getFoyerItem(0x%X) (%d)", stackPos(0));
+	assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
+	return _foyerItemTable[stackPos(0)];
 }
 
 int KyraEngine::cmd_setFoyerItem(ScriptState *script) {
-	warning("STUB: cmd_setFoyerItem");
-	return 0;
+	debug(3, "cmd_setFoyerItem(0x%X) (%d, %d)", stackPos(0), stackPos(1));
+	assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
+	_foyerItemTable[stackPos(0)] = stackPos(1);
+	return stackPos(1);
 }
 
 int KyraEngine::cmd_setNoItemDropRegion(ScriptState *script) {
@@ -1634,8 +1779,8 @@
 }
 
 int KyraEngine::cmd_passiveProtection(ScriptState *script) {
-	warning("STUB: cmd_passiveProtection");
-	return 0;
+	debug(3, "cmd_passiveProtection(0x%X) ()", script);
+	return 1;
 }
 
 int KyraEngine::cmd_setPlayingLoop(ScriptState *script) {
@@ -1675,7 +1820,11 @@
 }
 
 int KyraEngine::cmd_fillRect(ScriptState *script) {
-	warning("STUB: cmd_fillRect");
+	debug(3, "cmd_fillRect(0x%X) (%d, %d, %d, %d, %d, 0x%X)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
+	int videoPageBackup = _screen->_curPage;
+	_screen->_curPage = stackPos(0);
+	_screen->fillRect(stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
+	_screen->_curPage = videoPageBackup;
 	return 0;
 }
 

Index: sprites.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/sprites.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- sprites.cpp	22 Dec 2005 01:49:59 -0000	1.14
+++ sprites.cpp	24 Dec 2005 18:00:35 -0000	1.15
@@ -149,16 +149,16 @@
 			switch (READ_LE_UINT16(data)) {
 			case 0xFF88:
 				data += 2;
-				debug(5, "func: Set sprite image.");
-				debug(5, "Sprite index %i", READ_LE_UINT16(data));
+				debug(6, "func: Set sprite image.");
+				debug(6, "Sprite index %i", READ_LE_UINT16(data));
 				_anims[i].sprite = READ_LE_UINT16(data);
 				data += 2;
-				//debug(5, "Unused %i", READ_LE_UINT16(data));
+				//debug(6, "Unused %i", READ_LE_UINT16(data));
 				data += 2;
-				debug(5, "X %i", READ_LE_UINT16(data));
+				debug(6, "X %i", READ_LE_UINT16(data));
 				_anims[i].x = READ_LE_UINT16(data);
 				data += 2;
-				debug(5, "Y %i", READ_LE_UINT16(data));
+				debug(6, "Y %i", READ_LE_UINT16(data));
 				_anims[i].y = READ_LE_UINT16(data);
 				data += 2;
 				_anims[i].flipX = false;
@@ -166,16 +166,16 @@
 				break;
 			case 0xFF8D:
 				data += 2;
-				debug(5, "func: Set sprite image, flipped.");
-				debug(5, "Sprite index %i", READ_LE_UINT16(data));
+				debug(6, "func: Set sprite image, flipped.");
+				debug(6, "Sprite index %i", READ_LE_UINT16(data));
 				_anims[i].sprite = READ_LE_UINT16(data);
 				data += 2;
 				//debug(9, "Unused %i", READ_LE_UINT16(data));
 				data += 2;
-				debug(5, "X %i", READ_LE_UINT16(data));
+				debug(6, "X %i", READ_LE_UINT16(data));
 				_anims[i].x = READ_LE_UINT16(data);
 				data += 2;
-				debug(5, "Y %i", READ_LE_UINT16(data));
+				debug(6, "Y %i", READ_LE_UINT16(data));
 				_anims[i].y = READ_LE_UINT16(data);
 				data += 2;
 				_anims[i].flipX = true;
@@ -183,24 +183,24 @@
 				break;
 			case 0xFF8A:
 				data += 2;
-				debug(5, "func: Set time to wait");
-				debug(5, "Time %i", READ_LE_UINT16(data));
+				debug(6, "func: Set time to wait");
+				debug(6, "Time %i", READ_LE_UINT16(data));
 				_anims[i].nextRun = _system->getMillis() + READ_LE_UINT16(data) * _animDelay;
 				data += 2;
 				break;
 			case 0xFFB3:
 				data += 2;
-				debug(5, "func: Set time to wait to random value");
+				debug(6, "func: Set time to wait to random value");
 				rndNr = READ_LE_UINT16(data) + _rnd.getRandomNumber( READ_LE_UINT16(data) + 2);
-				debug(5, "Minimum time %i", READ_LE_UINT16(data));
+				debug(6, "Minimum time %i", READ_LE_UINT16(data));
 				data += 2;
-				debug(5, "Maximum time %i", READ_LE_UINT16(data));
+				debug(6, "Maximum time %i", READ_LE_UINT16(data));
 				data += 2;
 				_anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;
 				break;
 			case 0xFF8C:
 				data += 2;
-				debug(5, "func: Wait until wait time has elapsed");
+				debug(6, "func: Wait until wait time has elapsed");
 				_anims[i].reentry = data;
 				endLoop = true;
 				//assert( _anims[i].nextRun > _system->getMillis());
@@ -217,35 +217,35 @@
 				break;		
 			case 0xFF97:
 				data += 2;
-				debug(5, "func: Set default X coordinate of sprite");
-				debug(5, "X %i", READ_LE_UINT16(data));
+				debug(6, "func: Set default X coordinate of sprite");
+				debug(6, "X %i", READ_LE_UINT16(data));
 				_anims[i].x = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFF98:
 				data += 2;
-				debug(5, "func: Set default Y coordinate of sprite");
-				debug(5, "Y %i", READ_LE_UINT16(data));
+				debug(6, "func: Set default Y coordinate of sprite");
+				debug(6, "Y %i", READ_LE_UINT16(data));
 				_anims[i].y = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFF8B:
-				debug(5, "func: Jump to start of script section");
+				debug(6, "func: Jump to start of script section");
 				//data = scriptStart;
 				_anims[i].nextRun = _system->getMillis();
 				endLoop = true;
 				break;
 			case 0xFF8E:
 				data += 2;
-				debug(5, "func: Begin for () loop");
-				debug(5, "Iterations: %i", READ_LE_UINT16(data));
+				debug(6, "func: Begin for () loop");
+				debug(6, "Iterations: %i", READ_LE_UINT16(data));
 				_anims[i].loopsLeft = READ_LE_UINT16(data);
 				data += 2;
 				_anims[i].loopStart = data;
 				break;
 			case 0xFF8F:
 				data += 2;
-				debug(5, "func: End for () loop");
+				debug(6, "func: End for () loop");
 				if (_anims[i].loopsLeft > 0) {
 					_anims[i].loopsLeft--;
 					data = _anims[i].loopStart;
@@ -253,8 +253,8 @@
 				break;
 			case 0xFF90:
 				data += 2;
-				debug(5, "func: Set sprite image using default X and Y");
-				debug(5, "Sprite index %i", READ_LE_UINT16(data));
+				debug(6, "func: Set sprite image using default X and Y");
+				debug(6, "Sprite index %i", READ_LE_UINT16(data));
 				_anims[i].sprite = READ_LE_UINT16(data);
 				_anims[i].flipX = false;
 				data += 2;
@@ -262,8 +262,8 @@
 				break;
 			case 0xFF91:
 				data += 2;
-				debug(5, "func: Set sprite image using default X and Y, flipped.");
-				debug(5, "Sprite index %i", READ_LE_UINT16(data));
+				debug(6, "func: Set sprite image using default X and Y, flipped.");
+				debug(6, "Sprite index %i", READ_LE_UINT16(data));
 				_anims[i].sprite = READ_LE_UINT16(data);
 				_anims[i].flipX = true;
 				data += 2;
@@ -271,29 +271,29 @@
 				break;
 			case 0xFF92:
 				data += 2;
-				debug(5, "func: Increase value of default X-coordinate");
-				debug(5, "Increment %i", READ_LE_UINT16(data));
+				debug(6, "func: Increase value of default X-coordinate");
+				debug(6, "Increment %i", READ_LE_UINT16(data));
 				_anims[i].x += READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFF93:
 				data += 2;
-				debug(5, "func: Increase value of default Y-coordinate");
-				debug(5, "Increment %i", READ_LE_UINT16(data));
+				debug(6, "func: Increase value of default Y-coordinate");
+				debug(6, "Increment %i", READ_LE_UINT16(data));
 				_anims[i].y += READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFF94:
 				data += 2;
-				debug(5, "func: Decrease value of default X-coordinate");
-				debug(5, "Decrement %i", READ_LE_UINT16(data));
+				debug(6, "func: Decrease value of default X-coordinate");
+				debug(6, "Decrement %i", READ_LE_UINT16(data));
 				_anims[i].x -= READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFF95:
 				data += 2;
-				debug(5, "func: Decrease value of default Y-coordinate");
-				debug(5, "Decrement %i", READ_LE_UINT16(data));
+				debug(6, "func: Decrease value of default Y-coordinate");
+				debug(6, "Decrement %i", READ_LE_UINT16(data));
 				_anims[i].y -= READ_LE_UINT16(data);
 				data += 2;
 				break;
@@ -312,22 +312,22 @@
 				break;*/
 			case 0xFFAD:
 				data += 2;
-				debug(5, "func: Set Brandon's X coordinate");
-				debug(5, "X %i", READ_LE_UINT16(data));
+				debug(6, "func: Set Brandon's X coordinate");
+				debug(6, "X %i", READ_LE_UINT16(data));
 				_engine->_currentCharacter->x1 = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFFAE:
 				data += 2;
-				debug(5, "func: Set Brandon's Y coordinate");
-				debug(5, "Y %i", READ_LE_UINT16(data));
+				debug(6, "func: Set Brandon's Y coordinate");
+				debug(6, "Y %i", READ_LE_UINT16(data));
 				_engine->_currentCharacter->y1 = READ_LE_UINT16(data);
 				data += 2;
 				break;
 			case 0xFFAF:
 				data += 2;
-				debug(5, "func: Set Brandon's sprite");
-				debug(5, "Sprite %i", READ_LE_UINT16(data));
+				debug(6, "func: Set Brandon's sprite");
+				debug(6, "Sprite %i", READ_LE_UINT16(data));
 				_engine->_currentCharacter->currentAnimFrame = READ_LE_UINT16(data);
 				data += 2;
 				break;
@@ -337,15 +337,15 @@
 				break;
 			case 0xFFAB:
 				data += 2;
-				debug(5, "func: Update Brandon's sprite");
+				debug(6, "func: Update Brandon's sprite");
 				_engine->animRefreshNPC(0);
 				_engine->flagAllObjectsForRefresh();
 				_engine->updateAllObjectShapes();
 				break;
 			case 0xFFB0:
 				data += 2;
-				debug(5, "func: Play sound");
-				debug(5, "Sound index %i", READ_LE_UINT16(data));
+				debug(6, "func: Play sound");
+				debug(6, "Sound index %i", READ_LE_UINT16(data));
 				//_engine->snd_playSoundEffect(READ_LE_UINT16(data));
 				data += 2;
 				break;
@@ -359,11 +359,11 @@
 				break;
 			case 0xFFB4:
 				data += 2;
-				debug(5, "func: Play (at random) a certain sound at a certain percentage of time");
-				debug(5, "Sound index %i", READ_LE_UINT16(data));
+				debug(6, "func: Play (at random) a certain sound at a certain percentage of time");
+				debug(6, "Sound index %i", READ_LE_UINT16(data));
 				sound = READ_LE_UINT16(data);
 				data += 2;
-				debug(5, "Percentage %i", READ_LE_UINT16(data));
+				debug(6, "Percentage %i", READ_LE_UINT16(data));
 				rndNr = _rnd.getRandomNumber(100);
 				//if (rndNr <= READ_LE_UINT16(data))
 					//_engine->snd_playSoundEffect(sound);

Index: staticres.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/staticres.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- staticres.cpp	23 Dec 2005 17:49:14 -0000	1.27
+++ staticres.cpp	24 Dec 2005 18:00:35 -0000	1.28
@@ -653,14 +653,50 @@
 	 0, -2, -2, -2,  0,  2,  2,  2
 };
 
-const int16 KyraEngine::_itemPosX[] = {
+const uint16 KyraEngine::_itemPosX[] = {
 	95, 115, 135, 155, 175, 95, 115, 135, 155, 175
 };
 
-const int8 KyraEngine::_itemPosY[] = {
+const uint8 KyraEngine::_itemPosY[] = {
 	160, 160, 160, 160, 160, 181, 181, 181, 181, 181
 };
 
+Button KyraEngine::_buttonData[] = {
+	{ 0, 0x02, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x01, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x009, 0xA4, 0x36, 0x1E, /*XXX,*/ 0, 0/*opt_handleMenu, XXX*/ },
+	{ 0, 0x03, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x04, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x05, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x06, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x07, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x08, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x09, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x0A, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x0B, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
+	{ 0, 0x15, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0x9C, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
+	{ 0, 0x16, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0E7, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
+	{ 0, 0x17, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0xB5, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
+	{ 0, 0x18, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x113, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ }
+};
+
+Button *KyraEngine::_buttonDataListPtr[] = {
+	&_buttonData[1],
+	&_buttonData[2],
+	&_buttonData[3],
+	&_buttonData[4],
+	&_buttonData[5],
+	&_buttonData[6],
+	&_buttonData[7],
+	&_buttonData[8],
+	&_buttonData[9],
+	&_buttonData[10],
+	&_buttonData[11],
+	&_buttonData[12],
+	&_buttonData[13],
+	&_buttonData[14],
+	0
+};
+
 const uint8 KyraEngine::_magicMouseItemStartFrame[] = {
 	0xAD, 0xB7, 0xBE, 0x00
 };
@@ -679,4 +715,7 @@
 
 const uint16 KyraEngine::_amuletX[] = { 231, 275, 253, 253 };
 const uint16 KyraEngine::_amuletY[] = { 170, 170, 159, 181 };
+
+const uint16 KyraEngine::_amuletX2[] = { 0x000, 0x0FD, 0x0E7, 0x0FD, 0x113, 0x000 };
+const uint16 KyraEngine::_amuletY2[] = { 0x000, 0x09F, 0x0AA, 0x0B5, 0x0AA, 0x000 };
 } // End of namespace Kyra





More information about the Scummvm-git-logs mailing list