[Scummvm-cvs-logs] SF.net SVN: scummvm: [23700] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Sat Aug 12 11:16:27 CEST 2006


Revision: 23700
Author:   drmccoy
Date:     2006-08-12 02:16:08 -0700 (Sat, 12 Aug 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=23700&view=rev

Log Message:
-----------
- Some more goblins-handling functions
- Fixed some mistakes I made in the Parse_v2 functions. Now the goblins
  (finally) move. Also, the correct music is played in the first screen.
- Found the hook for the menu
- On freeing a sound slot, only stop the playing music if it's in the
  slot to free

Modified Paths:
--------------
    scummvm/trunk/engines/gob/draw_v2.cpp
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/game_v2.cpp
    scummvm/trunk/engines/gob/gob.cpp
    scummvm/trunk/engines/gob/gob.h
    scummvm/trunk/engines/gob/goblin.cpp
    scummvm/trunk/engines/gob/goblin.h
    scummvm/trunk/engines/gob/init.cpp
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v1.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/map_v2.cpp
    scummvm/trunk/engines/gob/mult.h
    scummvm/trunk/engines/gob/mult_v2.cpp
    scummvm/trunk/engines/gob/music.cpp
    scummvm/trunk/engines/gob/music.h
    scummvm/trunk/engines/gob/parse_v2.cpp
Modified: scummvm/trunk/engines/gob/draw_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/draw_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -478,7 +478,7 @@
 	int16 y;
 	Video::SurfaceDesc *sourceSurf;
 	Video::SurfaceDesc *destSurf;
-	bool deltaveto;
+	bool deltaVeto;
 	int16 left;
 	int16 ratio;
 	int16 spriteLeft;
@@ -494,10 +494,10 @@
 // '---
 
 	if (operation & 0x10) {
-		deltaveto = true;
+		deltaVeto = true;
 		operation &= 0x0F;
 	} else
-		deltaveto = false;
+		deltaVeto = false;
 
 	if (_sourceSurface >= 100)
 		_sourceSurface -= 80;
@@ -505,7 +505,7 @@
 	if (_destSurface >= 100)
 		_destSurface -= 80;
 
-	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
+	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
 		if ((_sourceSurface == 21) && (operation != DRAW_LOADSPRITE)) {
 			_spriteLeft += _backDeltaX;
 			_spriteTop += _backDeltaY;
@@ -864,7 +864,7 @@
 		_destSpriteX += len * strlen(_textToPrint);
 	}
 
-	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
+	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
 		if (_sourceSurface == 21) {
 			_spriteLeft -= _backDeltaX;
 			_spriteTop -= _backDeltaY;

Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/game.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -344,7 +344,8 @@
 		return;
 
 	if (_soundADL[slot]) {
-		_vm->_music->stopPlay();
+		if (_vm->_music->getIndex() == slot)
+			_vm->_music->stopPlay();
 		if (_soundFromExt[slot] == 1) {
 			delete[] ((char *) _soundSamples[slot]);
 			_soundFromExt[slot] = 0;
@@ -866,8 +867,10 @@
 		warning("Your game version doesn't support the requested language, using the first one available");
 		for (i = 0; i < 10; i++) {
 			handle = openLocTextFile(locTextFile, i);
-			if (handle >= 0)
+			if (handle >= 0) {
 				_vm->_global->_language = i;
+				break;
+			}
 		}
 	}
 

Modified: scummvm/trunk/engines/gob/game_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/game_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -115,6 +115,7 @@
 			loadTotFile(_curTotFile);
 			if (_totFileData == 0) {
 				_vm->_draw->blitCursor();
+				_vm->_inter->_terminate = 2;
 				break;
 			}
 
@@ -258,6 +259,13 @@
 
 			strcpy(_curTotFile, _totToLoad);
 		}
+	} else {
+		_vm->_scenery->_pCaptureCounter = oldCaptureCounter;
+		_vm->_global->_inter_execPtr = (char *)_totFileData;
+		_vm->_global->_inter_execPtr += READ_LE_UINT16(_totFileData + (skipPlay << 1) + 0x66);
+		_vm->_inter->callSub(2);
+		if (_vm->_inter->_terminate != 0)
+			_vm->_inter->_terminate = 2;
 	}
 
 	strcpy(_curTotFile, savedTotName);

Modified: scummvm/trunk/engines/gob/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/gob.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -193,6 +193,11 @@
 	_quitRequested = true;
 }
 
+void GobEngine::writeVarDebug(uint32 offs, uint32 v) {
+	warning("Setting var %d(%d) to %d", offs, offs >> 2, v);
+	(*(uint32 *)(_global->_inter_variables + (offs))) = v;
+}
+
 int GobEngine::init() {
 	_snd = new Snd(this);
 	_global = new Global(this);

Modified: scummvm/trunk/engines/gob/gob.h
===================================================================
--- scummvm/trunk/engines/gob/gob.h	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/gob.h	2006-08-12 09:16:08 UTC (rev 23700)
@@ -55,6 +55,7 @@
 #define	VAR(var)			VAR_OFFSET((var) << 2)
 #define VAR_ADDRESS(var)		(&VAR(var))
 
+//#define	WRITE_VAR_OFFSET(offs, val)	_vm->writeVarDebug(offs, val)
 #define	WRITE_VAR_OFFSET(offs, val)	(VAR_OFFSET(offs) = (val))
 #define WRITE_VAR(var, val)		WRITE_VAR_OFFSET((var) << 2, (val))
 
@@ -120,6 +121,8 @@
 	Util *_util;
 	Inter *_inter;
 	Music *_music;
+
+	void writeVarDebug(uint32 offs, uint32 v);
 };
 
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/goblin.cpp
===================================================================
--- scummvm/trunk/engines/gob/goblin.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/goblin.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -1890,10 +1890,10 @@
 	var_A = anim1->field_13;
 	var_C = anim1->field_14;
 
-	pass = _vm->_map->getPass(gob1X, gob1Y, 40);
+	pass = _vm->_map->getPass(gob1X, gob1Y);
 	if ((pass > 17) && (pass < 21))
 		warning("GOB2 Stub! sub_19AB7(anim0);");
-	pass = _vm->_map->getPass(gob2X, gob2Y, 40);
+	pass = _vm->_map->getPass(gob2X, gob2Y);
 	if ((pass > 17) && (pass < 21))
 		warning("GOB2 Stub! sub_19B45(anim1);");
 
@@ -1901,57 +1901,57 @@
 		return;
 
 	if (gob1Y > si) {
-		if (_vm->_map->getPass(di, si, 40) > 17) {
+		if (_vm->_map->getPass(di, si) > 17) {
 			do {
 				si--;
-			} while (_vm->_map->getPass(di, si, 40) > 17);
+			} while (_vm->_map->getPass(di, si) > 17);
 			si++;
-			if (_vm->_map->getPass(di - 1, si, 40) == 0) {
-				if (_vm->_map->getPass(di + 1, si, 40) != 0)
+			if (_vm->_map->getPass(di - 1, si) == 0) {
+				if (_vm->_map->getPass(di + 1, si) != 0)
 					di++;
 			} else
 				di--;
-			warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
+			sub_197A6(di, si, 0);
 		}
 	} else {
-		if (_vm->_map->getPass(di, si, 40) > 17) {
+		if (_vm->_map->getPass(di, si) > 17) {
 			do {
 				si++;
-			} while (_vm->_map->getPass(di, si, 40) > 17);
+			} while (_vm->_map->getPass(di, si) > 17);
 			si--;
-			if (_vm->_map->getPass(di - 1, si, 40) == 0) {
-				if (_vm->_map->getPass(di + 1, si, 40) != 0)
+			if (_vm->_map->getPass(di - 1, si) == 0) {
+				if (_vm->_map->getPass(di + 1, si) != 0)
 					di++;
 			} else
 				di--;
-			warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
+			sub_197A6(di, si, 0);
 		}
 	}
 	if (gob2Y > var_C) {
-		if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
+		if (_vm->_map->getPass(var_A, var_C) > 17) {
 			do {
 				var_C--;
-			} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
+			} while (_vm->_map->getPass(var_A, var_C) > 17);
 			var_C++;
-			if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
-				if (_vm->_map->getPass(var_A + 1, var_C, 40) != 0)
+			if (_vm->_map->getPass(var_A - 1, var_C) == 0) {
+				if (_vm->_map->getPass(var_A + 1, var_C) != 0)
 					var_A++;
 			} else
 				var_A--;
-			warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
+			sub_197A6(var_A, var_C, 1);
 		}
 	} else {
-		if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
+		if (_vm->_map->getPass(var_A, var_C) > 17) {
 			do {
 				var_C++;
-			} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
+			} while (_vm->_map->getPass(var_A, var_C) > 17);
 			var_C--;
-			if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
-				if (_vm->_map->getPass(var_A + 1, var_C, 40) != 0)
+			if (_vm->_map->getPass(var_A - 1, var_C) == 0) {
+				if (_vm->_map->getPass(var_A + 1, var_C) != 0)
 					var_A++;
 			} else
 				var_A--;
-			warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
+			sub_197A6(var_A, var_C, 1);
 		}
 	}
 }
@@ -2049,4 +2049,114 @@
 		animData->frame--;
 }
 
+void Goblin::sub_197A6(int16 destX, int16 destY, int16 objIndex) {
+	Mult::Mult_Object *obj;
+	Mult::Mult_AnimData *animData;
+	int16 mouseX;
+	int16 mouseY;
+	int16 gobDestX;
+	int16 gobDestY;
+	int16 mapWidth;
+	int16 mapHeight;
+	int16 di;
+	int16 si;
+	int16 var_1E;
+	int16 var_20;
+	int i;
+
+	obj = &_vm->_mult->_objects[objIndex];
+	animData = obj->pAnimData;
+
+	obj->gobDestX = destX;
+	obj->gobDestY = destY;
+	animData->field_13 = destX;
+	animData->field_14 = destY;
+
+	if ((animData->isBusy != 0) && (destX != -1) && (destY != -1)) {
+		if ((destX == -1) && (destY == -1)) {
+			mouseX = _vm->_global->_inter_mouseX;
+			mouseY = _vm->_global->_inter_mouseY;
+			if (_vm->_map->_bigTiles)
+				mouseY += ((_vm->_global->_inter_mouseX / _vm->_map->_tilesHeight) + 1) / 2;
+			obj->gobDestX = mouseX / _vm->_map->_tilesWidth;
+			obj->gobDestY = mouseY / _vm->_map->_tilesHeight;
+			gobDestX = obj->gobDestX;
+			gobDestY = obj->gobDestY;
+			if (_vm->_map->getPass(obj->gobDestX, obj->gobDestY) == 0) {
+				mapWidth = _vm->_map->_screenWidth / _vm->_map->_tilesWidth;
+				mapHeight = 200 / _vm->_map->_tilesHeight;
+				var_20 = 0;
+				di = -1;
+				si = -1;
+
+				for (i = 1; i <= gobDestX; i++)
+					if (_vm->_map->getPass(gobDestX - i, gobDestY) != 0)
+						break;
+				if (i <= gobDestX)
+					di = ((i - 1) * _vm->_map->_tilesWidth) + (mouseX % _vm->_map->_tilesWidth) + 1;
+				var_1E = i;
+
+				for (i = 1; (gobDestX + i) < mapWidth; i++)
+					if (_vm->_map->getPass(gobDestX + i, gobDestY) != 0)
+						break;
+				if ((gobDestX + i) < mapWidth)
+					si = (i * _vm->_map->_tilesWidth) - (mouseX % _vm->_map->_tilesWidth);
+
+				if ((si != -1) && ((di == -1) || (di > si))) {
+					di = si;
+					var_20 = 1;
+					var_1E = i;
+				}
+				si = -1;
+
+				for (i = 1; (gobDestY + i) < mapHeight; i++)
+					if (_vm->_map->getPass(gobDestX, gobDestY + i) != 0)
+						break;
+				if ((gobDestY + i) < mapHeight)
+					si = (i * _vm->_map->_tilesHeight) - (mouseY % _vm->_map->_tilesHeight);
+
+				if ((si != -1) && ((di == -1) || (di > si))) {
+					di = si;
+					var_20 = 2;
+					var_1E = i;
+				}
+				si = -1;
+
+				for (i = 1; i <= gobDestY; i++)
+					if (_vm->_map->getPass(gobDestX, gobDestY - i) != 0)
+						break;
+				if (i <= gobDestY)
+					si = ((i - 1) * _vm->_map->_tilesHeight) + (mouseY % _vm->_map->_tilesHeight) + 1;
+
+				if ((si != -1) && ((di == -1) || (di > si))) {
+					var_20 = 3;
+					var_1E = i;
+				}
+
+				if (var_20 == 0)
+					gobDestX -= var_1E;
+				else if (var_20 == 1)
+					gobDestX += var_1E;
+				else if (var_20 == 2)
+					gobDestY += var_1E;
+				else if (var_20 == 3)
+					gobDestY -= var_1E;
+			}
+			obj->gobDestX = gobDestX;
+			obj->gobDestY = gobDestY;
+			animData->field_13 = gobDestX;
+			animData->field_14 = gobDestY;
+			if (animData->field_13 == -1) {
+				animData->field_13 = obj->goblinX;
+				obj->gobDestX = obj->goblinX;
+			}
+			if (animData->field_14 == -1) {
+				animData->field_14 = obj->goblinY;
+				obj->gobDestY = obj->goblinY;
+			}
+		}
+	}
+	initiateMove(obj);
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/goblin.h
===================================================================
--- scummvm/trunk/engines/gob/goblin.h	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/goblin.h	2006-08-12 09:16:08 UTC (rev 23700)
@@ -220,6 +220,7 @@
 	void sub_19BD3(void);
 	void sub_195C7(int16 index, int16 state);
 	void sub_11984(Mult::Mult_Object *obj);
+	void sub_197A6(int16 destX, int16 destY, int16 objIndex);
 
 	virtual void placeObject(Gob_Object * objDesc, char animated,
 			int16 index, int16 x, int16 y, int16 state) = 0;

Modified: scummvm/trunk/engines/gob/init.cpp
===================================================================
--- scummvm/trunk/engines/gob/init.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/init.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -205,6 +205,7 @@
 
 		_vm->_global->_inter_variables = new char[varsCount * 4];
 		memset(_vm->_global->_inter_variables, 0, varsCount * 4);
+		WRITE_VAR(58, 1);
 
 		strcpy(_vm->_game->_curTotFile, buffer);
 

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/inter.h	2006-08-12 09:16:08 UTC (rev 23700)
@@ -314,6 +314,7 @@
 	void o2_totSub(void);
 	void o2_switchTotSub(void);
 	void o2_stub0x54(void);
+	void o2_stub0x55(void);
 	void o2_stub0x80(void);
 	void o2_stub0x82(void);
 	void o2_stub0x85(void);

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -1806,6 +1806,7 @@
 bool Inter_v1::o1_callBool(char &cmdCount, int16 &counter, int16 &retFlag) {
 	byte cmd;
 	bool boolRes = evalBoolResult() != 0;
+
 	if (boolRes != 0) {
 		if (counter == cmdCount
 				&& retFlag == 2)

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -231,7 +231,7 @@
 		OPCODE(o2_writeGoblinPos),
 		/* 54 */
 		OPCODE(o2_stub0x54),
-		OPCODE(o2_drawStub),
+		OPCODE(o2_stub0x55),
 		OPCODE(o2_placeGoblin),
 		{NULL, ""},
 		/* 58 */
@@ -718,6 +718,97 @@
 	_vm->_mult->_objects[index].pAnimData->pathExistence = 4;
 }
 
+void Inter_v2::o2_stub0x55(void) {
+	int16 index;
+	int16 state;
+	int16 f16;
+	int16 layer;
+	int16 animation;
+	int16 deltaX;
+	int16 deltaY;
+	int16 deltaHeight;
+	int16 deltaWidth;
+	Mult::Mult_Object *obj;
+	Mult::Mult_AnimData *objAnim;
+
+	index = _vm->_parse->parseValExpr();
+	state = _vm->_parse->parseValExpr();
+	f16 = _vm->_parse->parseValExpr();
+
+	obj = &_vm->_mult->_objects[index];
+	objAnim = obj->pAnimData;
+
+	objAnim->field_16 = f16;
+	switch (f16) {
+	case 0:
+		if (obj->goblinStates[state] != 0) {
+			objAnim->frame = 0;
+			layer = obj->goblinStates[state][0].layer;
+			animation = obj->goblinStates[state][0].animation;
+			objAnim->state = state;
+			objAnim->layer = layer;
+			objAnim->animation = animation;
+			*obj->pPosX = _vm->_scenery->_animations[animation].layers[layer].posX;
+			*obj->pPosY = _vm->_scenery->_animations[animation].layers[layer].posY;
+			objAnim->isPaused = 0;
+			objAnim->isStatic = 0;
+			objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
+		}
+		break;
+
+	case 1: 
+	case 4: 
+	case 6:
+		if (obj->goblinStates[state] != 0) {
+			layer = obj->goblinStates[objAnim->state][0].layer;
+			animation = obj->goblinStates[objAnim->state][0].animation;
+			_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
+			deltaHeight = _vm->_scenery->_animBottom - _vm->_scenery->_animTop;
+			deltaWidth = _vm->_scenery->_animRight - _vm->_scenery->_animLeft;
+			deltaX = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->layer].animDeltaX;
+			deltaY = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->layer].animDeltaY;
+			layer = obj->goblinStates[state][0].layer;
+			animation = obj->goblinStates[state][0].animation;
+			objAnim->state = state;
+			objAnim->layer = layer;
+			objAnim->animation = animation;
+			objAnim->frame = 0;
+			objAnim->isPaused = 0;
+			objAnim->isStatic = 0;
+			objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
+			_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
+			deltaHeight -= _vm->_scenery->_animBottom - _vm->_scenery->_animTop;
+			deltaWidth -= _vm->_scenery->_animRight - _vm->_scenery->_animLeft;
+			*obj->pPosX += deltaWidth + deltaX;
+			*obj->pPosY += deltaHeight + deltaY;
+		}
+		break;
+
+	case 11:
+		if (obj->goblinStates[state] != 0) {
+			layer = obj->goblinStates[state][0].layer;
+			animation = obj->goblinStates[state][0].animation;
+			objAnim->state = state;
+			objAnim->layer = layer;
+			objAnim->animation = animation;
+			objAnim->frame = 0;
+			objAnim->isPaused = 0;
+			objAnim->isStatic = 0;
+			objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
+			_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
+			if (_vm->_map->_bigTiles)
+				*obj->pPosY = ((obj->goblinY + 1) * _vm->_map->_tilesHeight) -
+					(_vm->_scenery->_animBottom - _vm->_scenery->_animTop) -
+					((obj->goblinY + 1) / 2);
+			else
+				*obj->pPosY = ((obj->goblinY + 1) * _vm->_map->_tilesHeight) -
+					(_vm->_scenery->_animBottom - _vm->_scenery->_animTop);
+			*obj->pPosX = obj->goblinX * _vm->_map->_tilesWidth;
+		}
+		break;
+	}
+}
+
 void Inter_v2::o2_stub0x80(void) {
 	int16 start;
 	int16 videoMode;
@@ -1276,7 +1367,7 @@
 	}
 	// loc_E2F3
 	if (_vm->_game->_soundTypes[index] & 8) {
-		_vm->_music->loadFromMemory((byte *) _vm->_game->_soundSamples[index]);
+		_vm->_music->loadFromMemory((byte *) _vm->_game->_soundSamples[index], index);
 		_vm->_music->setRepeating(repCount - 1);
 		_vm->_music->startPlay();
 	} else {
@@ -1635,6 +1726,8 @@
 		for (i = 0; i < _vm->_mult->_objCount; i++) {
 			_vm->_mult->_objects[i].pPosX = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posXVar / 4) * 4);
 			_vm->_mult->_objects[i].pPosY = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posYVar / 4) * 4);
+			if ((i == 0) || (i == 1))
+				warning("=> Goblin %d: %d (%d) (%d)", i, animDataVar + i * 4 * _vm->_global->_inter_animDataSize, (animDataVar + i * 4 * _vm->_global->_inter_animDataSize) / 4, _vm->_global->_inter_animDataSize);
 			_vm->_mult->_objects[i].pAnimData =
 			    (Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
 			    i * 4 * _vm->_global->_inter_animDataSize);

Modified: scummvm/trunk/engines/gob/map_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/map_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/map_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -117,11 +117,9 @@
 		_passMap = (int8 *) variables;
 		mapHeight = 200 / _tilesHeight;
 		mapWidth = _screenWidth / _tilesWidth;
-		for (i = 0; i < mapHeight; i++) {
-			for (j = 0; j < mapWidth; j++) {
+		for (i = 0; i < mapHeight; i++)
+			for (j = 0; j < mapWidth; j++)
 				setPass(j, i, mapData.readSByte());
-			}
-		}
 	}
 	mapData.seek(dataPos1);
 

Modified: scummvm/trunk/engines/gob/mult.h
===================================================================
--- scummvm/trunk/engines/gob/mult.h	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/mult.h	2006-08-12 09:16:08 UTC (rev 23700)
@@ -84,11 +84,7 @@
 		int16 lastRight;
 		int16 lastTop;
 		int16 lastBottom;
-		int8 someFlag;                      // New in GOB2
-		int16 somethingLeft;                // New in GOB2
-		int16 somethingTop;                 // New in GOB2
-		int16 somethingRight;               // New in GOB2
-		int16 somethingBottom;              // New in GOB2
+		Mult::Mult_GobState **goblinStates; // New in GOB2
 		int8 goblinX;                       // New in GOB2
 		int8 goblinY;                       // New in GOB2
 		int8 destX;                         // New in GOB2
@@ -97,7 +93,16 @@
 		int8 gobDestY;                      // New in GOB2
 		int8 nearestWayPoint;               // New in GOB2
 		int8 nearestDest;                   // New in GOB2
-		Mult::Mult_GobState **goblinStates; // New in GOB2
+		int8 field_22;                      // New in GOB2
+		int8 someFlag;                      // New in GOB2
+		int8 field_24;                      // New in GOB2
+		int8 field_25;                      // New in GOB2
+		int8 field_26;                      // New in GOB2
+		int8 field_27;                      // New in GOB2
+		int16 somethingLeft;                // New in GOB2
+		int16 somethingTop;                 // New in GOB2
+		int16 somethingRight;               // New in GOB2
+		int16 somethingBottom;              // New in GOB2
 	};
 
 	struct Mult_StaticKey {

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -327,9 +327,9 @@
 	}
 
 	_multData2->field_124[index][0] = flags;
-	for (i = 1; i < 4; i++) {
+	for (i = 1; i < 4; i++)
 		_multData2->field_124[index][i] = _vm->_parse->parseValExpr();
-	}
+
 	expr = _vm->_parse->parseValExpr();
 	_multData2->animKeysFrames[index] = expr;
 	_multData2->animKeysStartFrames[index] = expr;
@@ -473,7 +473,7 @@
 
 			_vm->_draw->adjustCoords(0, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
 
-			if ((_vm->_global->_videoMode == 0x14) &&
+			if ((_vm->_global->_videoMode == 0x13) && _vm->_video->_extraMode &&
 				((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
 					+ (_vm->_anim->_areaWidth * _vm->_anim->_areaHeight) / 4) < 64000) {
 				_vm->_anim->_animSurf = new Video::SurfaceDesc;

Modified: scummvm/trunk/engines/gob/music.cpp
===================================================================
--- scummvm/trunk/engines/gob/music.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/music.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -76,6 +76,7 @@
 Music::Music(GobEngine *vm) : _vm(vm) {
 	int i;
 
+	_index = -1;
 	_data = 0;
 	_playPos = 0;
 	_dataSize = 0;
@@ -365,6 +366,9 @@
 			_pollNotes[channel] = note;
 			setKey(channel, note, true, false);
 			break;
+		case 0x60:
+			warning("GOB2 Stub! ADL command 0x60");
+			break;
 		// Last note off
 		case 0x80:
 			note = _pollNotes[channel];
@@ -452,6 +456,7 @@
 bool Music::loadMusic(const char *filename) {
 	Common::File song;
 
+	unloadMusic();
 	song.open(filename);
 	if (!song.isOpen())
 		return false;
@@ -469,12 +474,13 @@
 	return true;
 }
 
-void Music::loadFromMemory(byte *data) {
+void Music::loadFromMemory(byte *data, int index) {
 	unloadMusic();
 	_repCount = 0;
 
 	_dataSize = (uint32) -1;
 	_data = data;
+	_index = index;
 
 	reset();
 	setVoices();
@@ -483,6 +489,7 @@
 
 void Music::unloadMusic(void) {
 	_playing = false;
+	_index = -1;
 
 	if (_data && _needFree)
 		delete[] _data;

Modified: scummvm/trunk/engines/gob/music.h
===================================================================
--- scummvm/trunk/engines/gob/music.h	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/music.h	2006-08-12 09:16:08 UTC (rev 23700)
@@ -45,12 +45,13 @@
 	bool playing() { return _playing; }
 	bool getRepeating(void) { return _repCount != 0; }
 	void setRepeating (int32 repCount) { _repCount = repCount; }
+	int getIndex(void) { return _index; }
 	virtual void startPlay(void);
 	virtual void stopPlay(void) { _mutex.lock(); _playing = false; _mutex.unlock(); }
 	virtual void playTrack(const char *trackname);
 	virtual void playBgMusic(void);
 	virtual bool loadMusic(const char *filename);
-	virtual void loadFromMemory(byte *data);
+	virtual void loadFromMemory(byte *data, int index=-1);
 	virtual void unloadMusic(void);
 
 // AudioStream API
@@ -68,6 +69,7 @@
 	static const unsigned char _operators[];
 	static const unsigned char _volRegNums [];
 	FM_OPL *_opl;
+	int _index;
 	byte *_data;
 	byte *_playPos;
 	uint32 _dataSize;

Modified: scummvm/trunk/engines/gob/parse_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/parse_v2.cpp	2006-08-08 21:35:15 UTC (rev 23699)
+++ scummvm/trunk/engines/gob/parse_v2.cpp	2006-08-12 09:16:08 UTC (rev 23700)
@@ -148,24 +148,24 @@
 					offset = arrDesc[dim] * offset + temp2;
 				}
 				if (operation == 16)
-					*valPtr = *(_vm->_global->_inter_variables + temp + offset);
+					*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
 				else if (operation == 26)
-					*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
+					*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
 				else if (operation == 27)
-					*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
+					*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
 				else if (operation == 28) {
 					_vm->_global->_inter_execPtr++;
 					temp2 = parseValExpr(12);
-					*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
+					*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
 				}
 				break;
 
 			case 17:
-				*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
+				*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
 				break;
 
 			case 18:
-				*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
+				*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
 				break;
 
 			case 19:
@@ -183,14 +183,14 @@
 
 			case 23:
 			case 24:
-				*valPtr = VAR(_vm->_inter->load16());
+				*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
 				break;
 
 			case 25:
 				temp = _vm->_inter->load16() * 4;
 				_vm->_global->_inter_execPtr++;
 				temp += parseValExpr(12);
-				*valPtr = *(_vm->_global->_inter_variables + temp);
+				*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
 				break;
 
 			case 29:
@@ -257,7 +257,7 @@
 				operPtr[-1] = operPtr[0];
 				valPtr[-1] = valPtr[0];
 				if (stkPos > 1 && operPtr[-2] == 1) {
-					valPtr[-2] = 20;
+					operPtr[-2] = 20;
 					valPtr[-2] = -valPtr[-1];
 
 					stkPos--;
@@ -265,26 +265,25 @@
 					valPtr--;
 				}
 
-				if (stkPos > 2 && operPtr[-2] > 4
-				    && operPtr[-2] < 9) {
+				if (stkPos > 2 && operPtr[-2] > 4 && operPtr[-2] < 9) {
 					stkPos -= 2;
 					operPtr -= 2;
 					valPtr -= 2;
 					switch (operPtr[0]) {
 					case 5:
-						operPtr[-1] *= operPtr[1];
+						valPtr[-1] *= valPtr[1];
 						break;
 
 					case 6:
-						operPtr[-1] /= operPtr[1];
+						valPtr[-1] /= valPtr[1];
 						break;
 
 					case 7:
-						operPtr[-1] %= operPtr[1];
+						valPtr[-1] %= valPtr[1];
 						break;
 
 					case 8:
-						operPtr[-1] &= operPtr[1];
+						valPtr[-1] &= valPtr[1];
 						break;
 					}
 				}
@@ -352,7 +351,7 @@
 	int32 prevVal;
 	int32 curVal;
 	int32 *valPtr;
-	char *operPtr;
+	byte *operPtr;
 	byte *arrDescPtr;
 	char var_C;
 	byte operation;
@@ -368,7 +367,7 @@
 	memset(operStack, 0, 20);
 
 	stkPos = -1;
-	operPtr = (char *)(operStack - 1);
+	operPtr = operStack - 1;
 	valPtr = values - 1;
 
 	while (1) {
@@ -376,7 +375,7 @@
 		operPtr++;
 		valPtr++;
 		operation = *_vm->_global->_inter_execPtr++;
-		if (operation >= 19 && operation <= 29) {
+		if (operation >= 16 && operation <= 29) {
 			switch (operation) {
 			case 16:
 			case 26:
@@ -396,30 +395,30 @@
 					offset = offset * arrDescPtr[dim] + temp2;
 				}
 				if (operation == 16)
-					*valPtr = *(_vm->_global->_inter_variables + temp + offset);
+					*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
 				else if (operation == 26)
-					*valPtr = *(uint32*)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
+					*valPtr = *(uint32 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
 				else if (operation == 27)
-					*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
+					*valPtr = *(int16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
 				else if (operation == 28) {
 					*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
 					if (*_vm->_global->_inter_execPtr == 13) {
 						_vm->_global->_inter_execPtr++;
 						temp2 = parseValExpr(12);
 						*operPtr = 20;
-						*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
+						*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
 					}
 				}
 				break;
 
 			case 17:
 				*operPtr = 20;
-				*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
+				*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
 				break;
 
 			case 18:
 				*operPtr = 20;
-				*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
+				*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
 				break;
 
 			case 19:
@@ -445,11 +444,15 @@
 				break;
 
 			case 23:
-			case 24:
 				*operPtr = 20;
 				*valPtr = VAR(_vm->_inter->load16());
 				break;
 
+			case 24:
+				*operPtr = 20;
+				*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
+				break;
+
 			case 25:
 				*operPtr = 22;
 				temp = _vm->_inter->load16() * 4;
@@ -458,7 +461,7 @@
 					_vm->_global->_inter_execPtr++;
 					temp += parseValExpr(12);
 					*operPtr = 20;
-					*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
+					*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
 				}
 				break;
 
@@ -560,7 +563,7 @@
 				break;
 			}
 			continue;
-		}		// op>= 19 && op <= 29
+		}		// op >= 16 && op <= 29
 
 		if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
 			while (stkPos >= 2) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list