[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.96,1.97 kyra.h,1.54,1.55 staticres.cpp,1.28,1.29

Johannes Schickel lordhoto at users.sourceforge.net
Mon Dec 26 06:55:11 CET 2005


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

Modified Files:
	kyra.cpp kyra.h staticres.cpp 
Log Message:
Started to implement the amulet button callback.
Also implemented some of the first jewel functionallity.
And cleaned up the resource unloading a bit.


Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.96
retrieving revision 1.97
diff -u -d -r1.96 -r1.97
--- kyra.cpp	24 Dec 2005 18:00:35 -0000	1.96
+++ kyra.cpp	26 Dec 2005 14:53:51 -0000	1.97
@@ -182,6 +182,16 @@
 	
 	_seq_WSATable = _seq_CPSTable = _seq_COLTable = _seq_textsTable = 0;
 	_seq_WSATable_Size = _seq_CPSTable_Size = _seq_COLTable_Size = _seq_textsTable_Size = 0;
+	
+	_roomFilenameTable = _characterImageTable = 0;
+	_roomFilenameTableSize = _characterImageTableSize = 0;
+	_itemList = _takenList = _placedList = _droppedList = _noDropList = 0;
+	_itemList_Size = _takenList_Size = _placedList_Size = _droppedList_Size = _noDropList_Size = 0;
+	_putDownFirst = _waitForAmulet = _blackJewel = _poisonGone = _healingTip = 0;
+	_putDownFirst_Size = _waitForAmulet_Size = _blackJewel_Size = _poisonGone_Size = _healingTip_Size = 0;
+	
+	_defaultShapeTable = _healingShapeTable = _healingShape2Table = 0;
+	_defaultShapeTableSize = _healingShapeTableSize = _healingShape2TableSize = 0;
 
 	// Setup mixer
 	if (!_mixer->isReady()) {
@@ -344,6 +354,7 @@
 
 	_brandonPosX = _brandonPosY = -1;
 	_brandonDrawFrame = 113;
+	_deathHandler = 0xFF;
 	
 	memset(_itemTable, 0, sizeof(_itemTable));
 	memset(_exitList, 0xFFFF, sizeof(_exitList));
@@ -981,6 +992,37 @@
 	setGameFlag(0x55+jewel);
 }
 
+void KyraEngine::seq_brandonHealing() {
+	debug(9, "seq_brandonHealing()");
+	if (!(_deathHandler & 8))
+		return;
+	if (_currentCharacter->sceneId == 210) {
+		//if (_unkSceneVar == 4 || _unkSceneVar == 6)
+		//	return;
+	}
+	_screen->hideMouse();
+	checkAmuletAnimFlags();
+	assert(_healingShapeTable);
+	setupShapes123(_healingShapeTable, 22, 0);
+	setBrandonAnimSeqSize(3, 48);
+	// snd_playSoundEffect(0x53);
+	for (int i = 123; i <= 144; ++i) {
+		_currentCharacter->currentAnimFrame = i;
+		animRefreshNPC(0);
+		delayWithTicks(8);
+	}
+	for (int i = 125; i >= 123; --i) {
+		_currentCharacter->currentAnimFrame = i;
+		animRefreshNPC(0);
+		delayWithTicks(8);
+	}
+	resetBrandonAnimSeqSize();
+	_currentCharacter->currentAnimFrame = 7;
+	animRefreshNPC(0);
+	freeShapes123();
+	_screen->showMouse();
+}
+
 bool KyraEngine::seq_skipSequence() const {
 	debug(9, "KyraEngine::seq_skipSequence()");
 	return _quitFlag || _abortIntroFlag;
@@ -2600,14 +2642,14 @@
 }
 
 void KyraEngine::characterSays(char *chatStr, int8 charNum, int8 chatDuration) {
-	debug(9, "KyraEngine:::characterSays('%s', %i, %d)", chatStr, charNum, chatDuration);
+	debug(9, "KyraEngine::characterSays('%s', %i, %d)", chatStr, charNum, chatDuration);
 	uint8 startAnimFrames[] =  { 0x10, 0x32, 0x56, 0x0, 0x0, 0x0 };
 
 	uint16 chatTicks;
 	int16 convoInitialized;
 	int8 chatPartnerNum;
 
-	if (_currentCharacter->sceneId == 0xD2)
+	if (_currentCharacter->sceneId == 210)
 		return;
 
 	convoInitialized = initCharacterChat(charNum);	
@@ -2634,7 +2676,7 @@
 	if (yPos < 11)
 		yPos = 11;
 
-	if (yPos > 100 )
+	if (yPos > 100)
 		yPos = 100;
 
 	_talkMessageY = yPos;
@@ -3582,7 +3624,7 @@
 }
 
 #pragma mark -
-#pragma mark - Animation specific code
+#pragma mark - Animation/shape specific code
 #pragma mark -
 
 void KyraEngine::preserveAllBackgrounds() {
@@ -3780,7 +3822,7 @@
 									tempFlags = 1;
 								}
 								tempFlags |= 0x900 | flagUnk1 | 0x4000;
-								_screen->drawShape(drawPage, _shapes[4+shapesIndex], xpos, ypos, 2, tempFlags | 4, _unkBrandonPoisonFlags, 1, 0/*XXX*/, drawLayer, _brandonScaleX, _brandonScaleY);
+								_screen->drawShape(drawPage, _shapes[4+shapesIndex], xpos, ypos, 2, tempFlags | 4, _unkBrandonPoisonFlags, int(1), int(0)/*XXX*/, drawLayer, _brandonScaleX, _brandonScaleY);
 							} else {
 								if (!(flagUnk2 & 0x4000)) {
 									tempFlags = 0;
@@ -3790,7 +3832,7 @@
 									tempFlags |= 0x900 | flagUnk1;
 								}
 								
-								_screen->drawShape(drawPage, _shapes[4+shapesIndex], xpos, ypos, 2, tempFlags | 4, _unkBrandonPoisonFlags, 1, drawLayer, _brandonScaleX, _brandonScaleY);
+								_screen->drawShape(drawPage, _shapes[4+shapesIndex], xpos, ypos, 2, tempFlags | 4, _unkBrandonPoisonFlags, int(1), drawLayer, _brandonScaleX, _brandonScaleY);
 							}
 						}
 					} else {
@@ -4021,6 +4063,146 @@
 	animObj->bkgdChangeFlag = 1;
 }
 
+void KyraEngine::drawJewelPress(int jewel, int drawSpecial) {
+	debug(9, "drawJewelPress(%d, %d)", jewel, drawSpecial);
+	_screen->hideMouse();
+	int shape = 0;
+	if (drawSpecial) {
+		shape = 0x14E;
+	} else {
+		shape = jewel + 0x149;
+	}
+	// snd_playSoundEffect(0x45);
+	_screen->drawShape(0, _shapes[4+shape], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
+	_screen->updateScreen();
+	delayWithTicks(2);
+	if (drawSpecial) {
+		shape = 0x148;
+	} else {
+		shape = jewel + 0x143;
+	}
+	_screen->drawShape(0, _shapes[4+shape], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
+	_screen->updateScreen();
+	_screen->showMouse();
+}
+
+void KyraEngine::drawJewelsFadeOutStart() {
+	debug(9, "drawJewelsFadeOutStart()");
+	static const uint16 jewelTable1[] = { 0x164, 0x15F, 0x15A, 0x155, 0x150, 0xFFFF };
+	static const uint16 jewelTable2[] = { 0x163, 0x15E, 0x159, 0x154, 0x14F, 0xFFFF };
+	static const uint16 jewelTable3[] = { 0x166, 0x160, 0x15C, 0x157, 0x152, 0xFFFF };
+	static const uint16 jewelTable4[] = { 0x165, 0x161, 0x15B, 0x156, 0x151, 0xFFFF };
+	for (int i = 0; jewelTable1[i] != 0xFFFF; ++i) {
+		if (queryGameFlag(0x57)) {
+			_screen->drawShape(0, _shapes[4+jewelTable1[i]], _amuletX2[2], _amuletY2[2], 0, 0);
+		}
+		if (queryGameFlag(0x59)) {
+			_screen->drawShape(0, _shapes[4+jewelTable3[i]], _amuletX2[4], _amuletY2[4], 0, 0);
+		}
+		if (queryGameFlag(0x56)) {
+			_screen->drawShape(0, _shapes[4+jewelTable2[i]], _amuletX2[1], _amuletY2[1], 0, 0);
+		}
+		if (queryGameFlag(0x58)) {
+			_screen->drawShape(0, _shapes[4+jewelTable4[i]], _amuletX2[3], _amuletY2[3], 0, 0);
+		}
+		_screen->updateScreen();
+		delayWithTicks(3);
+	}
+}
+
+void KyraEngine::drawJewelsFadeOutEnd(int jewel) {
+	debug(9, "drawJewelsFadeOutEnd(%d)", jewel);
+	static const uint16 jewelTable[] = { 0x153, 0x158, 0x15D, 0x162, 0x148, 0xFFFF };
+	int newDelay = 0;
+	switch (jewel-1) {
+		case 2:
+			if (_currentCharacter->sceneId >= 109 && _currentCharacter->sceneId <= 198) {
+				newDelay = 18900;
+			} else {
+				newDelay = 8100;
+			}
+			break;
+			
+		default:
+			newDelay = 3600;
+			break;
+	}
+	setGameFlag(0xF1);
+	setTimerCountdown(19, newDelay);
+	_screen->hideMouse();
+	for (int i = 0; jewelTable[i] != 0xFFFF; ++i) {
+		uint16 shape = jewelTable[i];
+		if (queryGameFlag(0x57)) {
+			_screen->drawShape(0, _shapes[4+shape], _amuletX2[2], _amuletY2[2], 0, 0);
+		}
+		if (queryGameFlag(0x59)) {
+			_screen->drawShape(0, _shapes[4+shape], _amuletX2[4], _amuletY2[4], 0, 0);
+		}
+		if (queryGameFlag(0x56)) {
+			_screen->drawShape(0, _shapes[4+shape], _amuletX2[1], _amuletY2[1], 0, 0);
+		}
+		if (queryGameFlag(0x58)) {
+			_screen->drawShape(0, _shapes[4+shape], _amuletX2[3], _amuletY2[3], 0, 0);
+		}
+		_screen->updateScreen();
+		delayWithTicks(3);
+	}
+	_screen->showMouse();
+}
+
+void KyraEngine::setupShapes123(const Shape *shapeTable, int endShape, int flags) {
+	debug(9, "setupShapes123(0x%X, startShape, flags)", shapeTable, endShape, flags);
+	for (int i = 123; i <= 172; ++i) {
+		_shapes[4+i] = NULL;
+	}
+	uint8 curImage = 0xFF;
+	int curPageBackUp = _screen->_curPage;
+	_screen->_curPage = 8;	// we are using page 8 here in the original page 2 was backuped and then used for this stuff
+	int shapeFlags = 2;
+	if (flags)
+		shapeFlags = 3;
+	for (int i = 123; i < 123+endShape; ++i) {
+		uint8 newImage = shapeTable[i-123].imageIndex;
+		if (newImage != curImage) {
+			assert(_characterImageTable);
+			loadBitmap(_characterImageTable[newImage], 8, 8, 0);
+			curImage = newImage;
+		}
+		_shapes[4+i] = _screen->encodeShape(shapeTable[i-123].x<<3, shapeTable[i-123].y, shapeTable[i-123].w<<3, shapeTable[i-123].h, flags);
+		assert(i-7 < _defaultShapeTableSize);
+		_defaultShapeTable[i-7].xOffset = shapeTable[i-123].xOffset;
+		_defaultShapeTable[i-7].yOffset = shapeTable[i-123].yOffset;
+		_defaultShapeTable[i-7].w = shapeTable[i-123].w;
+		_defaultShapeTable[i-7].h = shapeTable[i-123].h;
+	}
+	_screen->_curPage = curPageBackUp;
+}
+
+void KyraEngine::freeShapes123() {
+	debug(9, "freeShapes123()");
+	for (int i = 123; i <= 172; ++i) {
+		free(_shapes[4+i]);
+		_shapes[4+i] = NULL;
+	}
+}
+
+void KyraEngine::setBrandonAnimSeqSize(int width, int height) {
+	debug(9, "setBrandonAnimSeqSize(%d, %d)", width, height);
+	restoreAllObjectBackgrounds();
+	_brandonAnimSeqSizeWidth = _charactersAnimState[0].width;
+	_brandonAnimSeqSizeHeight = _charactersAnimState[0].height;
+	_charactersAnimState[0].width = width + 1;
+	_charactersAnimState[0].height = height;
+	preserveAllBackgrounds();
+}
+
+void KyraEngine::resetBrandonAnimSeqSize() {
+	restoreAllObjectBackgrounds();
+	_charactersAnimState[0].width = _brandonAnimSeqSizeWidth;
+	_charactersAnimState[0].height = _brandonAnimSeqSizeHeight;
+	preserveAllBackgrounds();
+}
+
 #pragma mark -
 #pragma mark - Queue handling
 #pragma mark -
@@ -4228,6 +4410,17 @@
 	copyBackgroundBlock(x, 4, 1);
 }
 
+void KyraEngine::makeBrandonFaceMouse() {
+	debug(9, "makeBrandonFaceMouse()");
+	if (_mouseX >= _currentCharacter->x1) {
+		_currentCharacter->facing = 3;
+	} else {
+		_currentCharacter->facing = 5;
+	}
+	animRefreshNPC(0);
+	updateAllObjectShapes();
+}
+
 #pragma mark -
 #pragma mark - Pathfinder
 #pragma mark -
@@ -5097,7 +5290,7 @@
 
 void KyraEngine::timerRedrawAmulet(int timerNum) {
 	debug(9, "timerRedrawAmulet(%i)", timerNum);
-	if (queryGameFlag(241)) {
+	if (queryGameFlag(0xF1)) {
 		drawAmulet();
 		setTimerCountdown(19, -1);
 	}
@@ -5110,6 +5303,7 @@
 	static const int16 amuletTable2[] = {0x167, 0x162, 0x15D, 0x158, 0x153, 0x152, 0x157, 0x15C, 0x161, 0x166, 0x147, -1};
 	static const int16 amuletTable4[] = {0x167, 0x162, 0x15D, 0x158, 0x153, 0x151, 0x156, 0x15B, 0x160, 0x165, 0x146, -1};
 
+	resetGameFlag(0xF1);
 	_screen->hideMouse();
 
 	int i = 0;
@@ -5126,7 +5320,8 @@
 		if (queryGameFlag(88))
 			_screen->drawShape(0, _shapes[4+amuletTable4[i]], _amuletX[3], _amuletY[3], 0, 0);
 
-		delay(3 * _tickLength);
+		_screen->updateScreen();
+		delayWithTicks(3);
 		i++;
 	}
 	_screen->showMouse();
@@ -5661,6 +5856,81 @@
 	return 0;
 }
 
+int KyraEngine::buttonAmuletCallback(Button *caller) {
+	if (!(_deathHandler & 8))
+		return 1;
+	int jewel = caller->specialValue - 0x14;
+	if (_currentCharacter->sceneId == 210) {
+		//if (_unkSceneVar == 4 || _unkSceneVar == 6)
+		//	return 1;
+	}
+	if (!queryGameFlag(0x2D))
+		return 1;
+	if (_itemInHand != -1) {
+		assert(_putDownFirst);
+		characterSays(_putDownFirst[0], 0, -2);
+		return 1;
+	}
+	if (queryGameFlag(0xF1)) {
+		assert(_waitForAmulet);
+		characterSays(_waitForAmulet[0], 0, -2);
+		return 1;
+	}
+	if (!queryGameFlag(0x55+jewel)) {
+		assert(_blackJewel);
+		makeBrandonFaceMouse();
+		drawJewelPress(jewel, 1);
+		characterSays(_blackJewel[0], 0, -2);
+		return 1;
+	}
+	drawJewelPress(jewel, 0);
+	drawJewelsFadeOutStart();
+	drawJewelsFadeOutEnd(jewel);
+	
+	_scriptInterpreter->initScript(_scriptClick, _scriptClickData);
+	_scriptClick->variables[3] = 0;
+	_scriptClick->variables[6] = jewel;
+	_scriptInterpreter->startScript(_scriptClick, 4);
+	
+	while (_scriptInterpreter->validScript(_scriptClick)) {
+		_scriptInterpreter->runScript(_scriptClick);
+	}
+	
+	if (_scriptClick->variables[3])
+		return 1;
+	
+	_unkAmuletVar = 1;
+	switch (jewel-1) {
+		case 0:
+			if (_brandonStatusBit & 1) {
+				// seq_brandonHealing2
+			} else if (_brandonStatusBit == 0) {
+				seq_brandonHealing();
+				assert(_healingTip);
+				characterSays(_healingTip[0], 0, -2);
+			}
+			break;
+		
+		case 1:
+			warning("jewel 1 STUB");
+			break;
+		
+		case 2:
+			warning("jewel 2 STUB");
+			break;
+		
+		case 3:
+			warning("jewel 3 STUB");
+			break;
+		
+		default:
+			break;
+	}
+	_unkAmuletVar = 0;
+	// XXX clearKyrandiaButtonIO (!used before every return in this function!)
+	return 1;
+}
+
 void KyraEngine::processButtonList(Button *list) {
 	while (list) {
 		if (list->flags & 8) {

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- kyra.h	24 Dec 2005 18:00:35 -0000	1.54
+++ kyra.h	26 Dec 2005 14:53:51 -0000	1.55
@@ -504,6 +504,7 @@
 	void restoreRect1(int xpos, int ypos);
 	void copyBackgroundBlock(int x, int page, int flag);
 	void copyBackgroundBlock2(int x);
+	void makeBrandonFaceMouse();
 
 	void processInput(int xpos, int ypos);
 	int processInputHelper(int xpos, int ypos);
@@ -536,6 +537,13 @@
 	void animRemoveGameItem(int index);
 	void animAddGameItem(int index, uint16 sceneId);
 	void animAddNPC(int character);
+	void drawJewelPress(int jewel, int drawSpecial);
+	void drawJewelsFadeOutStart();
+	void drawJewelsFadeOutEnd(int jewel);
+	void setupShapes123(const Shape *shapeTable, int endShape, int flags);
+	void freeShapes123();
+	void setBrandonAnimSeqSize(int width, int height);
+	void resetBrandonAnimSeqSize();
 	
 	AnimObject *objectRemoveQueue(AnimObject *queue, AnimObject *rem);
 	AnimObject *objectAddHead(AnimObject *queue, AnimObject *head);
@@ -550,6 +558,7 @@
 	void seq_introKallakWriting();
 	void seq_introKallakMalcolm();
 	void seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly);
+	void seq_brandonHealing();
 
 	void wsa_processFrame(WSAMovieV1 *wsa, int frameNum, uint8 *dst);
 
@@ -572,6 +581,7 @@
 	void res_loadTable(const byte *src, byte ***loadTo, int *size);
 	void res_loadRoomTable(const byte *src, Room **loadTo, int *size);
 	void res_loadShapeTable(const byte *src, Shape **loadTo, int *size);
+	void res_freeLangTable(char ***sting, int *size);
 	
 	void waitForEvent();
 	void delay(uint32 millis, bool update = false);
@@ -601,6 +611,7 @@
 	void setTextFadeTimerCountdown(int16 countdown);
 	
 	int buttonInventoryCallback(Button *caller);
+	int buttonAmuletCallback(Button *caller);
 	Button *initButton(Button *list, Button *newButton);
 	void processButtonList(Button *list);
 	void processButton(Button *button);
@@ -634,6 +645,10 @@
 	bool _changedScene;
 	int _unkScreenVar1, _unkScreenVar2, _unkScreenVar3;
 	int _noDrawShapesFlag;
+	int _unkAmuletVar;
+	
+	int _brandonAnimSeqSizeWidth;
+	int _brandonAnimSeqSizeHeight;
 
 	WSAMovieV1 *_wsaObjects[10];
 	uint16 _entranceMouseCursorTracks[8];
@@ -655,10 +670,11 @@
 	
 	uint16 _brandonStatusBit;
 	uint8 _unkBrandonPoisonFlags[256];	// this seem not to be posion flags, it is used for drawing once
+	uint8 _deathHandler;
 	int _brandonPosX;
 	int _brandonPosY;
-	int16 _brandonScaleX;
-	int16 _brandonScaleY;
+	int _brandonScaleX;
+	int _brandonScaleY;
 	int _brandonDrawFrame;
 
 	uint16 _currentChatPartnerBackupFrame;
@@ -757,12 +773,22 @@
 	char **_placedList;
 	char **_droppedList;
 	char **_noDropList;
+	char **_putDownFirst;
+	char **_waitForAmulet;
+	char **_blackJewel;
+	char **_poisonGone;
+	char **_healingTip;
 	
 	int _itemList_Size;
 	int _takenList_Size;
 	int _placedList_Size;
 	int _droppedList_Size;
 	int _noDropList_Size;
+	int _putDownFirst_Size;
+	int _waitForAmulet_Size;
+	int _blackJewel_Size;
+	int _poisonGone_Size;
+	int _healingTip_Size;
 	
 	char **_characterImageTable;
 	int _characterImageTableSize;
@@ -770,6 +796,11 @@
 	Shape *_defaultShapeTable;
 	int _defaultShapeTableSize;
 	
+	Shape *_healingShapeTable;
+	int  _healingShapeTableSize;
+	Shape *_healingShape2Table;
+	int  _healingShape2TableSize;
+	
 	Room *_roomTable;
 	int _roomTableSize;	
 	char **_roomFilenameTable;

Index: staticres.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/staticres.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- staticres.cpp	24 Dec 2005 18:00:35 -0000	1.28
+++ staticres.cpp	26 Dec 2005 14:53:51 -0000	1.29
@@ -26,7 +26,7 @@
 
 namespace Kyra {
 
-#define RESFILE_VERSION 6
+#define RESFILE_VERSION 7
 
 #define GAME_FLAGS (GF_FLOPPY | GF_TALKIE | GF_DEMO | GF_AUDIOCD)
 #define LANGUAGE_FLAGS (GF_ENGLISH | GF_FRENCH | GF_GERMAN | GF_SPANISH | GF_LNGUNK)
@@ -212,6 +212,15 @@
 				temp = 0;
 			}
 		}
+		
+		res_loadLangTable("PUTDOWN.", &resFile, (byte***)&_putDownFirst, &_putDownFirst_Size, loadNativeLanguage);
+		res_loadLangTable("WAITAMUL.", &resFile, (byte***)&_waitForAmulet, &_waitForAmulet_Size, loadNativeLanguage);
+		res_loadLangTable("BLACKJEWEL.", &resFile, (byte***)&_blackJewel, &_blackJewel_Size, loadNativeLanguage);
+		res_loadLangTable("POISONGONE.", &resFile, (byte***)&_poisonGone, &_poisonGone_Size, loadNativeLanguage);
+		res_loadLangTable("HEALINGTIP.", &resFile, (byte***)&_healingTip, &_healingTip_Size, loadNativeLanguage);
+		
+		loadShapes(resFile, "HEALING.SHP", &_healingShapeTable, &_healingShapeTableSize);
+		loadShapes(resFile, "HEALING2.SHP", &_healingShape2Table, &_healingShape2TableSize);
 	}
 
 #undef loadRooms
@@ -223,33 +232,10 @@
 void KyraEngine::res_unloadResources(int type) {
 	debug(9, "res_unloadResources(%d)", type);
 	if ((type & RES_INTRO) || type == RES_ALL) {
-		for (int i = 0; i < _seq_WSATable_Size; ++i) {
-			delete [] _seq_WSATable[i];
-		}
-		delete [] _seq_WSATable;
-		_seq_WSATable_Size = 0;
-		_seq_WSATable = 0;
-		
-		for (int i = 0; i < _seq_CPSTable_Size; ++i) {
-			delete [] _seq_CPSTable[i];
-		}
-		delete [] _seq_CPSTable;
-		_seq_CPSTable_Size = 0;
-		_seq_CPSTable = 0;
-		
-		for (int i = 0; i < _seq_COLTable_Size; ++i) {
-			delete [] _seq_COLTable[i];
-		}
-		delete [] _seq_COLTable;
-		_seq_COLTable_Size = 0;
-		_seq_COLTable = 0;
-		
-		for (int i = 0; i < _seq_textsTable_Size; ++i) {
-			delete [] _seq_textsTable[i];
-		}
-		delete [] _seq_textsTable;
-		_seq_textsTable_Size = 0;
-		_seq_textsTable = 0;
+		res_freeLangTable(&_seq_WSATable, &_seq_WSATable_Size);
+		res_freeLangTable(&_seq_CPSTable, &_seq_CPSTable_Size);
+		res_freeLangTable(&_seq_COLTable, &_seq_COLTable_Size);
+		res_freeLangTable(&_seq_textsTable, &_seq_textsTable_Size);
 		
 		delete [] _seq_Forest; _seq_Forest = 0;
 		delete [] _seq_KallakWriting; _seq_KallakWriting = 0;
@@ -264,60 +250,22 @@
 	}
 	
 	if ((type & RES_INGAME) || type == RES_ALL) {
-		for (int i = 0; i < _roomFilenameTableSize; ++i) {
-			delete [] _roomFilenameTable[i];
-		}
-		delete [] _roomFilenameTable;
-		_roomFilenameTableSize = 0;
-		_roomFilenameTable = 0;
-		
+		res_freeLangTable(&_roomFilenameTable, &_roomFilenameTableSize);
+				
 		delete [] _roomTable; _roomTable = 0;
 		_roomTableSize = 0;
 		
-		for (int i = 0; i < _characterImageTableSize; ++i) {
-			delete [] _characterImageTable[i];
-		}
-		delete [] _characterImageTable;
-		_characterImageTableSize = 0;
-		
+		res_freeLangTable(&_characterImageTable, &_characterImageTableSize);
+				
 		delete [] _defaultShapeTable;
 		_defaultShapeTableSize = 0;
 		
-		for (int i = 0; i < _itemList_Size; ++i) {
-			delete [] _itemList[i];
-		}
-		delete [] _itemList;
-		_itemList_Size = 0;
-		_itemList = 0;
-		
-		for (int i = 0; i < _takenList_Size; ++i) {
-			delete [] _takenList[i];
-		}
-		delete [] _takenList;
-		_takenList_Size = 0;
-		_takenList = 0;
-		
-		for (int i = 0; i < _placedList_Size; ++i) {
-			delete [] _placedList[i];
-		}
-		delete [] _placedList;
-		_placedList_Size = 0;
-		_placedList = 0;
-		
-		for (int i = 0; i < _droppedList_Size; ++i) {
-			delete [] _droppedList[i];
-		}
-		delete [] _droppedList;
-		_droppedList_Size = 0;
-		_droppedList = 0;
-		
-		for (int i = 0; i < _noDropList_Size; ++i) {
-			delete [] _noDropList[i];
-		}
-		delete [] _noDropList;
-		_noDropList_Size = 0;
-		_noDropList = 0;
-		
+		res_freeLangTable(&_itemList, &_itemList_Size);
+		res_freeLangTable(&_takenList, &_takenList_Size);
+		res_freeLangTable(&_placedList, &_placedList_Size);
+		res_freeLangTable(&_droppedList, &_droppedList_Size);
+		res_freeLangTable(&_noDropList, &_noDropList_Size);
+				
 		delete [] _amuleteAnim;
 		_amuleteAnim = 0;
 		
@@ -325,6 +273,18 @@
 			delete [] _specialPalettes[i];
 			_specialPalettes[i] = 0;
 		}
+		
+		res_freeLangTable(&_putDownFirst, &_putDownFirst_Size);
+		res_freeLangTable(&_waitForAmulet, &_waitForAmulet_Size);
+		res_freeLangTable(&_blackJewel, &_blackJewel_Size);
+		res_freeLangTable(&_poisonGone, &_poisonGone_Size);
+		res_freeLangTable(&_healingTip, &_healingTip_Size);
+		
+		delete [] _healingShapeTable;
+		_healingShapeTableSize = 0;
+		
+		delete [] _healingShape2Table;
+		_healingShape2TableSize = 0;
 	}
 }
 
@@ -404,6 +364,19 @@
 	}
 }
 
+void KyraEngine::res_freeLangTable(char ***string, int *size) {
+	if (!string || !size)
+		return;
+	if (!*size || !*string)
+		return;
+	for (int i = 0; i < *size; ++i) {
+		delete [] (*string)[i];
+	}
+	delete [] *string;
+	size = 0;
+	*string = 0;
+}
+
 const ScreenDim Screen::_screenDimTable[] = {
 	{ 0x00, 0x00, 0x28, 0xC8, 0x0F, 0x0C, 0x00, 0x00 },
 	{ 0x08, 0x48, 0x18, 0x38, 0x0F, 0x0C, 0x00, 0x00 },
@@ -673,10 +646,10 @@
 	{ 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*/ }
+	{ 0, 0x15, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0x9C, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine::buttonAmuletCallback/*, XXX*/ },
+	{ 0, 0x16, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0E7, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine::buttonAmuletCallback/*, XXX*/ },
+	{ 0, 0x17, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0xB5, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine::buttonAmuletCallback/*, XXX*/ },
+	{ 0, 0x18, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x113, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine::buttonAmuletCallback/*, XXX*/ }
 };
 
 Button *KyraEngine::_buttonDataListPtr[] = {





More information about the Scummvm-git-logs mailing list