[Scummvm-cvs-logs] CVS: scummvm/gob goblin.cpp,1.30,1.31 goblin.h,1.8,1.9 inter.cpp,1.32,1.33 inter.h,1.7,1.8 inter_v1.cpp,1.5,1.6 inter_v2.cpp,1.1,1.2

Sven Hesse drmccoy at users.sourceforge.net
Tue Jan 10 03:31:03 CET 2006


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

Modified Files:
	goblin.cpp goblin.h inter.cpp inter.h inter_v1.cpp 
	inter_v2.cpp 
Log Message:
Moved Goblin::interFunc() to Inter_v1::o1_goblinFunc(), converting its switch() into an array of function pointers + lookup table


Index: goblin.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/goblin.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -d -r1.30 -r1.31
--- goblin.cpp	9 Jan 2006 16:10:22 -0000	1.30
+++ goblin.cpp	10 Jan 2006 11:30:23 -0000	1.31
@@ -2376,886 +2376,4 @@
 	}
 }
 
-void Goblin::interFunc(void) {
-	int16 cmd;
-	int16 extraData = 0;
-	Gob_Object *objDesc = NULL;
-	Gob_Object *gobDesc;
-	int16 xPos;
-	int16 yPos;
-	int16 x;
-	int16 y;
-	int16 item;
-	int16 val;
-	int16 layer;
-	int16 state;
-	int32 *retVarPtr;
-	bool objDescSet = false;
-
-	retVarPtr = (int32 *)VAR_ADDRESS(59);
-
-	cmd = _vm->_inter->load16();
-	_vm->_global->_inter_execPtr += 2;
-	if (cmd > 0 && cmd < 17) {
-		extraData = _vm->_inter->load16();
-		objDesc = _objects[extraData];
-		objDescSet = true;
-		extraData = _vm->_inter->load16();
-	}
-
-	if (cmd > 90 && cmd < 107) {
-		extraData = _vm->_inter->load16();
-		objDesc = _goblins[extraData];
-		objDescSet = true;
-		extraData = _vm->_inter->load16();
-		cmd -= 90;
-	}
-
-	if (cmd > 110 && cmd < 128) {
-		extraData = _vm->_inter->load16();
-		objDesc = _goblins[extraData];
-		objDescSet = true;
-		cmd -= 90;
-	} else if (cmd > 20 && cmd < 38) {
-		extraData = _vm->_inter->load16();
-		objDesc = _objects[extraData];
-		objDescSet = true;
-	}
-
-/*
-	NB: The original gobliiins engine did not initialize the objDesc
-	variable, so we manually check if objDesc is properly set before
-	checking if it is zero. If it was not set, we do not return. This
-	fixes a crash in the EGA version if the life bar is depleted, because
-	interFunc is called multiple times with cmd == 39.
-	Bug #1324814
-*/
-
-
-	if (cmd < 40 && objDescSet && objDesc == 0)
-		return;
-
-	debug(5, "cmd = %d", cmd);
-	switch (cmd) {
-	case 1:
-		objDesc->state = extraData;
-
-		if (objDesc == _actDestItemDesc)
-			*_destItemStateVarPtr = extraData;
-		break;
-
-	case 2:
-		objDesc->curFrame = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemFrameVarPtr = extraData;
-		break;
-
-	case 3:
-		objDesc->nextState = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemNextStateVarPtr = extraData;
-		break;
-
-	case 4:
-		objDesc->multState = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemMultStateVarPtr = extraData;
-		break;
-
-	case 5:
-		objDesc->order = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemOrderVarPtr = extraData;
-		break;
-
-	case 6:
-		objDesc->actionStartState = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemActStartStVarPtr = extraData;
-		break;
-
-	case 7:
-		objDesc->curLookDir = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemLookDirVarPtr = extraData;
-		break;
-
-	case 8:
-		objDesc->type = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemTypeVarPtr = extraData;
-
-		if (extraData == 0)
-			objDesc->toRedraw = 1;
-		break;
-
-	case 9:
-		objDesc->noTick = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemNoTickVarPtr = extraData;
-		break;
-
-	case 10:
-		objDesc->pickable = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemPickableVarPtr = extraData;
-		break;
-
-	case 12:
-		objDesc->xPos = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemScrXVarPtr = extraData;
-		break;
-
-	case 13:
-		objDesc->yPos = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemScrYVarPtr = extraData;
-		break;
-
-	case 14:
-		objDesc->doAnim = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemDoAnimVarPtr = extraData;
-		break;
-
-	case 15:
-		objDesc->relaxTime = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemRelaxVarPtr = extraData;
-		break;
-
-	case 16:
-		objDesc->maxTick = extraData;
-		if (objDesc == _actDestItemDesc)
-			*_destItemMaxTickVarPtr = extraData;
-		break;
-
-	case 21:
-		*retVarPtr = objDesc->state;
-		break;
-
-	case 22:
-		*retVarPtr = objDesc->curFrame;
-		break;
-
-	case 23:
-		*retVarPtr = objDesc->nextState;
-		break;
-
-	case 24:
-		*retVarPtr = objDesc->multState;
-		break;
-
-	case 25:
-		*retVarPtr = objDesc->order;
-		break;
-
-	case 26:
-		*retVarPtr = objDesc->actionStartState;
-		break;
-
-	case 27:
-		*retVarPtr = objDesc->curLookDir;
-		break;
-
-	case 28:
-		*retVarPtr = objDesc->type;
-		break;
-
-	case 29:
-		*retVarPtr = objDesc->noTick;
-		break;
-
-	case 30:
-		*retVarPtr = objDesc->pickable;
-		break;
-
-	case 32:
-		*retVarPtr = getObjMaxFrame(objDesc);
-		break;
-
-	case 33:
-		*retVarPtr = objDesc->xPos;
-		break;
-
-	case 34:
-		*retVarPtr = objDesc->yPos;
-		break;
-
-	case 35:
-		*retVarPtr = objDesc->doAnim;
-		break;
-
-	case 36:
-		*retVarPtr = objDesc->relaxTime;
-		break;
-
-	case 37:
-		*retVarPtr = objDesc->maxTick;
-		break;
-
-	case 40:
-	case 42:
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-		item = _vm->_inter->load16();
-
-		if (cmd == 42) {
-			xPos = VAR(xPos);
-			yPos = VAR(yPos);
-			item = VAR(item);
-		}
-
-		for (y = 0; y < Map::kMapHeight; y++) {
-			for (x = 0; x < Map::kMapWidth; x++) {
-				if ((_vm->_map->_itemsMap[y][x] & 0xff) == item) {
-					_vm->_map->_itemsMap[y][x] &= 0xff00;
-				} else if (((_vm->_map->_itemsMap[y][x] & 0xff00) >> 8)
-				    == item) {
-					_vm->_map->_itemsMap[y][x] &= 0xff;
-				}
-			}
-		}
-
-		if (xPos < Map::kMapWidth - 1) {
-			if (yPos > 0) {
-				if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
-				    (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
-				    0
-				    || (_vm->_map->_itemsMap[yPos][xPos +
-					    1] & 0xff00) != 0
-				    || (_vm->_map->_itemsMap[yPos - 1][xPos +
-					    1] & 0xff00) != 0) {
-
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
-					    + item;
-
-					_vm->_map->_itemsMap[yPos - 1][xPos] =
-					    (_vm->_map->_itemsMap[yPos -
-						1][xPos] & 0xff00) + item;
-
-					_vm->_map->_itemsMap[yPos][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos][xPos +
-						1] & 0xff00) + item;
-
-					_vm->_map->_itemsMap[yPos - 1][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos - 1][xPos +
-						1] & 0xff00) + item;
-				} else {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
-					    (item << 8);
-
-					_vm->_map->_itemsMap[yPos - 1][xPos] =
-					    (_vm->_map->_itemsMap[yPos -
-						1][xPos] & 0xff) + (item << 8);
-
-					_vm->_map->_itemsMap[yPos][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos][xPos +
-						1] & 0xff) + (item << 8);
-
-					_vm->_map->_itemsMap[yPos - 1][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos - 1][xPos +
-						1] & 0xff) + (item << 8);
-				}
-			} else {
-				if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
-				    (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xff00) !=
-				    0) {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
-					    + item;
-
-					_vm->_map->_itemsMap[yPos][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos][xPos +
-						1] & 0xff00) + item;
-				} else {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
-					    (item << 8);
-
-					_vm->_map->_itemsMap[yPos][xPos + 1] =
-					    (_vm->_map->_itemsMap[yPos][xPos +
-						1] & 0xff) + (item << 8);
-				}
-			}
-		} else {
-			if (yPos > 0) {
-				if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
-				    (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
-				    0) {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
-					    + item;
-
-					_vm->_map->_itemsMap[yPos - 1][xPos] =
-					    (_vm->_map->_itemsMap[yPos -
-						1][xPos] & 0xff00) + item;
-				} else {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
-					    (item << 8);
-
-					_vm->_map->_itemsMap[yPos - 1][xPos] =
-					    (_vm->_map->_itemsMap[yPos -
-						1][xPos] & 0xff) + (item << 8);
-				}
-			} else {
-				if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0) {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
-					    + item;
-				} else {
-					_vm->_map->_itemsMap[yPos][xPos] =
-					    (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
-					    (item << 8);
-				}
-			}
-		}
-
-		if (item < 0 || item >= 20)
-			break;
-
-		if (xPos > 1 && _vm->_map->_passMap[yPos][xPos - 2] == 1) {
-			_vm->_map->_itemPoses[item].x = xPos - 2;
-			_vm->_map->_itemPoses[item].y = yPos;
-			_vm->_map->_itemPoses[item].orient = 4;
-			break;
-		}
-
-		if (xPos < Map::kMapWidth - 2 && _vm->_map->_passMap[yPos][xPos + 2] == 1) {
-			_vm->_map->_itemPoses[item].x = xPos + 2;
-			_vm->_map->_itemPoses[item].y = yPos;
-			_vm->_map->_itemPoses[item].orient = 0;
-			break;
-		}
-
-		if (xPos < Map::kMapWidth - 1 && _vm->_map->_passMap[yPos][xPos + 1] == 1) {
-			_vm->_map->_itemPoses[item].x = xPos + 1;
-			_vm->_map->_itemPoses[item].y = yPos;
-			_vm->_map->_itemPoses[item].orient = 0;
-			break;
-		}
-
-		if (xPos > 0 && _vm->_map->_passMap[yPos][xPos - 1] == 1) {
-			_vm->_map->_itemPoses[item].x = xPos - 1;
-			_vm->_map->_itemPoses[item].y = yPos;
-			_vm->_map->_itemPoses[item].orient = 4;
-			break;
-		}
-		break;
-
-	case 41:
-	case 43:
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-
-		if (cmd == 43) {
-			xPos = VAR(xPos);
-			yPos = VAR(yPos);
-		}
-
-		if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0) {
-			*retVarPtr = (_vm->_map->_itemsMap[yPos][xPos] & 0xff00) >> 8;
-		} else {
-			*retVarPtr = _vm->_map->_itemsMap[yPos][xPos];
-		}
-		break;
-
-	case 44:
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-		val = _vm->_inter->load16();
-		_vm->_map->_passMap[yPos][xPos] = val;
-		break;
-
-	case 50:
-		item = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-
-		_gobPositions[item].x = xPos * 2;
-		_gobPositions[item].y = yPos * 2;
-
-		objDesc = _goblins[item];
-		objDesc->nextState = 21;
-
-		nextLayer(objDesc);
-
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-		_vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
-		    objDesc->xPos, objDesc->yPos, 0);
-
-		objDesc->yPos =
-		    (_gobPositions[item].y * 6 + 6) - (_vm->_scenery->_toRedrawBottom -
-		    _vm->_scenery->_animTop);
-		objDesc->xPos =
-		    _gobPositions[item].x * 12 - (_vm->_scenery->_toRedrawLeft -
-		    _vm->_scenery->_animLeft);
-
-		objDesc->curFrame = 0;
-		objDesc->state = 21;
-		if (_currentGoblin == item) {
-			*_curGobScrXVarPtr = objDesc->xPos;
-			*_curGobScrYVarPtr = objDesc->yPos;
-
-			*_curGobFrameVarPtr = 0;
-			*_curGobStateVarPtr = 18;
-			_pressedMapX = _gobPositions[item].x;
-			_pressedMapY = _gobPositions[item].y;
-		}
-		break;
-
-	case 52:
-		item = _vm->_inter->load16();
-		*retVarPtr = _gobPositions[item].x >> 1;
-		break;
-
-	case 53:
-		item = _vm->_inter->load16();
-		*retVarPtr = _gobPositions[item].y >> 1;
-		break;
-
-	case 150:
-		item = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-
-		objDesc = _goblins[item];
-		if (yPos == 0) {
-			objDesc->multState = xPos;
-			objDesc->nextState = xPos;
-			nextLayer(objDesc);
-
-			layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-			objDesc->xPos =
-			    _vm->_scenery->_animations[objDesc->animation].layers[layer]->
-			    posX;
-			objDesc->yPos =
-			    _vm->_scenery->_animations[objDesc->animation].layers[layer]->
-			    posY;
-
-			*_curGobScrXVarPtr = objDesc->xPos;
-			*_curGobScrYVarPtr = objDesc->yPos;
-			*_curGobFrameVarPtr = 0;
-			*_curGobStateVarPtr = objDesc->state;
-			*_curGobNextStateVarPtr = objDesc->nextState;
-			*_curGobMultStateVarPtr = objDesc->multState;
-			*_curGobMaxFrameVarPtr =
-			    getObjMaxFrame(objDesc);
-			_noPick = 1;
-			break;
-		}
-
-		objDesc->multState = 21;
-		objDesc->nextState = 21;
-		objDesc->state = 21;
-		nextLayer(objDesc);
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-		_vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
-		    objDesc->xPos, objDesc->yPos, 0);
-
-		objDesc->yPos =
-		    (yPos * 6 + 6) - (_vm->_scenery->_toRedrawBottom - _vm->_scenery->_animTop);
-		objDesc->xPos =
-		    xPos * 12 - (_vm->_scenery->_toRedrawLeft - _vm->_scenery->_animLeft);
-
-		_gobPositions[item].x = xPos;
-		_pressedMapX = xPos;
-		_vm->_map->_curGoblinX = xPos;
-
-		_gobPositions[item].y = yPos;
-		_pressedMapY = yPos;
-		_vm->_map->_curGoblinY = yPos;
-
-		*_curGobScrXVarPtr = objDesc->xPos;
-		*_curGobScrYVarPtr = objDesc->yPos;
-		*_curGobFrameVarPtr = 0;
-		*_curGobStateVarPtr = 21;
-		*_curGobNextStateVarPtr = 21;
-		*_curGobMultStateVarPtr = -1;
-		_noPick = 0;
-		break;
-
-	case 250:
-		item = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-
-		_gobPositions[item].x = xPos;
-		_gobPositions[item].y = yPos;
-
-		objDesc = _goblins[item];
-		objDesc->nextState = 21;
-		nextLayer(objDesc);
-
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-		_vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
-		    objDesc->xPos, objDesc->yPos, 0);
-
-		objDesc->yPos =
-		    (yPos * 6 + 6) - (_vm->_scenery->_toRedrawBottom - _vm->_scenery->_animTop);
-		objDesc->xPos =
-		    xPos * 12 - (_vm->_scenery->_toRedrawLeft - _vm->_scenery->_animLeft);
-
-		objDesc->curFrame = 0;
-		objDesc->state = 21;
-
-		if (_currentGoblin == item) {
-			*_curGobScrXVarPtr = objDesc->xPos;
-			*_curGobScrYVarPtr = objDesc->yPos;
-			*_curGobFrameVarPtr = 0;
-			*_curGobStateVarPtr = 18;
-
-			_pressedMapX = _gobPositions[item].x;
-			_pressedMapY = _gobPositions[item].y;
-		}
-		break;
-
-	case 251:
-		item = _vm->_inter->load16();
-		state = _vm->_inter->load16();
-
-		objDesc = _goblins[item];
-		objDesc->nextState = state;
-
-		nextLayer(objDesc);
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-		objDesc->xPos =
-		    _vm->_scenery->_animations[objDesc->animation].layers[layer]->posX;
-		objDesc->yPos =
-		    _vm->_scenery->_animations[objDesc->animation].layers[layer]->posY;
-
-		if (item == _currentGoblin) {
-			*_curGobScrXVarPtr = objDesc->xPos;
-			*_curGobScrYVarPtr = objDesc->yPos;
-			*_curGobFrameVarPtr = 0;
-			*_curGobStateVarPtr = objDesc->state;
-			*_curGobMultStateVarPtr = objDesc->multState;
-		}
-		break;
-
-	case 252:
-		item = _vm->_inter->load16();
-		state = _vm->_inter->load16();
-		objDesc = _objects[item];
-
-		objDesc->nextState = state;
-
-		nextLayer(objDesc);
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-		objDesc->xPos =
-		    _vm->_scenery->_animations[objDesc->animation].layers[layer]->posX;
-		objDesc->yPos =
-		    _vm->_scenery->_animations[objDesc->animation].layers[layer]->posY;
-
-		objDesc->toRedraw = 1;
-		objDesc->type = 0;
-		if (objDesc == _actDestItemDesc) {
-			*_destItemScrXVarPtr = objDesc->xPos;
-			*_destItemScrYVarPtr = objDesc->yPos;
-
-			*_destItemStateVarPtr = objDesc->state;
-			*_destItemNextStateVarPtr = -1;
-			*_destItemMultStateVarPtr = -1;
-			*_destItemFrameVarPtr = 0;
-		}
-		break;
-
-	case 152:
-		item = _vm->_inter->load16();
-		val = _vm->_inter->load16();
-		objDesc = _objects[item];
-		objDesc->unk14 = val;
-		break;
-
-	case 200:
-		_itemIdInPocket = _vm->_inter->load16();
-		break;
-
-	case 201:
-		_itemIndInPocket = _vm->_inter->load16();
-		break;
-
-	case 202:
-		*retVarPtr = _itemIdInPocket;
-		break;
-
-	case 203:
-		*retVarPtr = _itemIndInPocket;
-		break;
-
-	case 204:
-		item = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-		val = _vm->_inter->load16();
-
-		_vm->_map->_itemPoses[item].x = xPos;
-		_vm->_map->_itemPoses[item].y = yPos;
-		_vm->_map->_itemPoses[item].orient = val;
-		break;
-
-	case 500:
-		extraData = _vm->_inter->load16();
-		objDesc = _objects[extraData];
-
-		objDesc->relaxTime--;
-		if (objDesc->relaxTime < 0 &&
-		    getObjMaxFrame(objDesc) == objDesc->curFrame) {
-			objDesc->relaxTime = _vm->_util->getRandom(100) + 50;
-			objDesc->curFrame = 0;
-			objDesc->toRedraw = 1;
-		}
-		break;
-
-	case 502:
-		item = _vm->_inter->load16();
-		*retVarPtr = _gobPositions[item].x;
-		break;
-
-	case 503:
-		item = _vm->_inter->load16();
-		*retVarPtr = _gobPositions[item].y;
-		break;
-
-	case 600:
-		_pathExistence = 0;
-		break;
-
-	case 601:
-		extraData = _vm->_inter->load16();
-		_goblins[extraData]->visible = 1;
-		break;
-
-	case 602:
-		extraData = _vm->_inter->load16();
-		_goblins[extraData]->visible = 0;
-		break;
-
-	case 603:
-		extraData = _vm->_inter->load16();
-		item = _vm->_inter->load16();
-
-		objDesc = _objects[extraData];
-		if (objIntersected(objDesc, _goblins[item]) != 0)
-			*retVarPtr = 1;
-		else
-			*retVarPtr = 0;
-		break;
-
-	case 604:
-		extraData = _vm->_inter->load16();
-		item = _vm->_inter->load16();
-
-		objDesc = _goblins[extraData];
-		if (objIntersected(objDesc, _goblins[item]) != 0)
-			*retVarPtr = 1;
-		else
-			*retVarPtr = 0;
-		break;
-
-	case 605:
-		item = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-		yPos = _vm->_inter->load16();
-		val = _vm->_inter->load16();
-
-		_vm->_map->_itemPoses[item].x = xPos;
-		_vm->_map->_itemPoses[item].y = yPos;
-		_vm->_map->_itemPoses[item].orient = val;
-		break;
-
-	case 1000:
-		extraData = _vm->_inter->load16();
-		if (_vm->_game->_extHandle >= 0)
-			_vm->_dataio->closeData(_vm->_game->_extHandle);
-
-		loadObjects((char *)VAR_ADDRESS(extraData));
-		_vm->_game->_extHandle = _vm->_dataio->openData(_vm->_game->_curExtFile);
-		break;
-
-	case 1001:
-		freeAllObjects();
-		break;
-
-	case 1002:
-		animateObjects();
-		break;
-
-	case 1003:
-		drawObjects();
-
-		if (_vm->_features & GF_MAC)
-			_vm->_music->playBgMusic();
-		else if (_vm->_cdrom->getTrackPos() == -1)
-			_vm->_cdrom->playBgMusic();
-		break;
-
-	case 1004:
-		_vm->_map->loadMapsInitGobs();
-		break;
-
-	case 1005:
-		extraData = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-
-		if ((uint16)VAR(xPos) == 0) {
-			item =
-			    doMove(_goblins[_currentGoblin], 1,
-			    (uint16)VAR(extraData));
-		} else {
-			item =
-			    doMove(_goblins[_currentGoblin], 1, 3);
-		}
-
-		if (item != 0)
-			switchGoblin(item);
-		break;
-
-	case 1006:
-		switchGoblin(0);
-		break;
-
-	case 1008:
-		loadGobDataFromVars();
-		break;
-
-	case 1009:
-		extraData = _vm->_inter->load16();
-		cmd = _vm->_inter->load16();
-		xPos = _vm->_inter->load16();
-
-		if ((uint16)VAR(xPos) == 0) {
-			WRITE_VAR(cmd, treatItem((uint16)VAR(extraData)));
-			break;
-		}
-
-		WRITE_VAR(cmd, treatItem(3));
-		break;
-
-	case 1010:
-		doMove(_goblins[_currentGoblin], 0, 0);
-		break;
-
-	case 1011:
-		extraData = _vm->_inter->load16();
-		if (VAR(extraData) != 0)
-			_goesAtTarget = 1;
-		else
-			_goesAtTarget = 0;
-		break;
-
-	case 1015:
-		extraData = _vm->_inter->load16();
-		extraData = VAR(extraData);
-		_objects[10]->xPos = extraData;
-
-		extraData = _vm->_inter->load16();
-		extraData = VAR(extraData);
-		_objects[10]->yPos = extraData;
-		break;
-
-	case 2005:
-		gobDesc = _goblins[0];
-		if (_currentGoblin != 0) {
-			_goblins[_currentGoblin]->doAnim = 1;
-			_goblins[_currentGoblin]->nextState = 21;
-
-			nextLayer(_goblins[_currentGoblin]);
-			_currentGoblin = 0;
-
-			gobDesc->doAnim = 0;
-			gobDesc->type = 0;
-			gobDesc->toRedraw = 1;
-
-			_pressedMapX = _gobPositions[0].x;
-			_vm->_map->_destX = _gobPositions[0].x;
-			_gobDestX = _gobPositions[0].x;
-
-			_pressedMapY = _gobPositions[0].y;
-			_vm->_map->_destY = _gobPositions[0].y;
-			_gobDestY = _gobPositions[0].y;
-
-			*_curGobVarPtr = 0;
-			_pathExistence = 0;
-			_readyToAct = 0;
-		}
-
-		if (gobDesc->state != 10 && _itemIndInPocket != -1 &&
-		    getObjMaxFrame(gobDesc) == gobDesc->curFrame) {
-
-			gobDesc->stateMach = gobDesc->realStateMach;
-			xPos = _gobPositions[0].x;
-			yPos = _gobPositions[0].y;
-
-			gobDesc->nextState = 10;
-			layer = nextLayer(gobDesc);
-
-			_vm->_scenery->updateAnim(layer, 0, gobDesc->animation, 0,
-			    gobDesc->xPos, gobDesc->yPos, 0);
-
-			gobDesc->yPos =
-			    (yPos * 6 + 6) - (_vm->_scenery->_toRedrawBottom -
-			    _vm->_scenery->_animTop);
-			gobDesc->xPos =
-			    xPos * 12 - (_vm->_scenery->_toRedrawLeft - _vm->_scenery->_animLeft);
-		}
-
-		if (gobDesc->state != 10)
-			break;
-
-		if (_itemIndInPocket == -1)
-			break;
-
-		if (gobDesc->curFrame != 10)
-			break;
-
-		objDesc = _objects[_itemIndInPocket];
-		objDesc->type = 0;
-		objDesc->toRedraw = 1;
-		objDesc->curFrame = 0;
-
-		objDesc->order = gobDesc->order;
-		objDesc->animation =
-		    objDesc->stateMach[objDesc->state][0]->animation;
-
-		layer = objDesc->stateMach[objDesc->state][0]->layer;
-
-		_vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
-		    objDesc->xPos, objDesc->yPos, 0);
-
-		objDesc->yPos +=
-		    (_gobPositions[0].y * 6 + 5) - _vm->_scenery->_toRedrawBottom;
-
-		if (gobDesc->curLookDir == 4) {
-			objDesc->xPos += _gobPositions[0].x * 12 + 14
-			    - (_vm->_scenery->_toRedrawLeft + _vm->_scenery->_toRedrawRight) / 2;
-		} else {
-			objDesc->xPos += _gobPositions[0].x * 12
-			    - (_vm->_scenery->_toRedrawLeft + _vm->_scenery->_toRedrawRight) / 2;
-		}
-
-		_itemIndInPocket = -1;
-		_itemIdInPocket = -1;
-		_vm->_util->beep(50);
-		break;
-
-	default:
-		warning("interFunc: Unknown command %d!", cmd);
-		_vm->_global->_inter_execPtr -= 2;
-		cmd = _vm->_inter->load16();
-		_vm->_global->_inter_execPtr += cmd * 2;
-		break;
-	}
-	return;
-}
-
 } // End of namespace Gob

Index: goblin.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/goblin.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- goblin.h	7 Jan 2006 22:28:54 -0000	1.8
+++ goblin.h	10 Jan 2006 11:30:23 -0000	1.9
@@ -201,7 +201,7 @@
 	void swapItems(int16 indexToPick, int16 idToPick);
 	void treatItemPick(int16 itemId);
 	int16 treatItem(int16 action);
-	void interFunc(void);
+	int16 doMove(Gob_Object *gobDesc, int16 cont, int16 action);
 
 	Goblin(GobEngine *vm);
 
@@ -224,7 +224,6 @@
 	void moveTreatRopeStairs(Gob_Object *gobDesc);
 	void movePathFind(Gob_Object *gobDesc, int16 nextAct);
 	void moveAdvance(Gob_Object *gobDesc, int16 nextAct, int16 framesCount);
-	int16 doMove(Gob_Object *gobDesc, int16 cont, int16 action);
 };
 
 }				// End of namespace Gob

Index: inter.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- inter.cpp	9 Jan 2006 16:10:22 -0000	1.32
+++ inter.cpp	10 Jan 2006 11:30:23 -0000	1.33
@@ -30,6 +30,7 @@
 #include "gob/mult.h"
 #include "gob/goblin.h"
 #include "gob/cdrom.h"
+#include "gob/map.h"
 
 namespace Gob {
 
@@ -297,4 +298,145 @@
 	WRITE_VAR(11, t->tm_sec);
 }
 
+void Inter::manipulateMap(int16 xPos, int16 yPos, int16 item) {
+	for (int16 y = 0; y < Map::kMapHeight; y++) {
+		for (int16 x = 0; x < Map::kMapWidth; x++) {
+			if ((_vm->_map->_itemsMap[y][x] & 0xff) == item) {
+				_vm->_map->_itemsMap[y][x] &= 0xff00;
+			} else if (((_vm->_map->_itemsMap[y][x] & 0xff00) >> 8)
+					== item) {
+				_vm->_map->_itemsMap[y][x] &= 0xff;
+			}
+		}
+	}
+
+	if (xPos < Map::kMapWidth - 1) {
+		if (yPos > 0) {
+			if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+					(_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
+					0
+					|| (_vm->_map->_itemsMap[yPos][xPos +
+						1] & 0xff00) != 0
+					|| (_vm->_map->_itemsMap[yPos - 1][xPos +
+						1] & 0xff00) != 0) {
+
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+						+ item;
+
+				_vm->_map->_itemsMap[yPos - 1][xPos] =
+						(_vm->_map->_itemsMap[yPos -
+					1][xPos] & 0xff00) + item;
+
+				_vm->_map->_itemsMap[yPos][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos][xPos +
+					1] & 0xff00) + item;
+
+				_vm->_map->_itemsMap[yPos - 1][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos - 1][xPos +
+					1] & 0xff00) + item;
+			} else {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+						(item << 8);
+
+				_vm->_map->_itemsMap[yPos - 1][xPos] =
+						(_vm->_map->_itemsMap[yPos -
+					1][xPos] & 0xff) + (item << 8);
+
+				_vm->_map->_itemsMap[yPos][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos][xPos +
+					1] & 0xff) + (item << 8);
+
+				_vm->_map->_itemsMap[yPos - 1][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos - 1][xPos +
+					1] & 0xff) + (item << 8);
+			}
+		} else {
+			if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+					(_vm->_map->_itemsMap[yPos][xPos + 1] & 0xff00) !=
+					0) {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+						+ item;
+
+				_vm->_map->_itemsMap[yPos][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos][xPos +
+					1] & 0xff00) + item;
+			} else {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+						(item << 8);
+
+				_vm->_map->_itemsMap[yPos][xPos + 1] =
+						(_vm->_map->_itemsMap[yPos][xPos +
+					1] & 0xff) + (item << 8);
+			}
+		}
+	} else {
+		if (yPos > 0) {
+			if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+					(_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
+					0) {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+						+ item;
+
+				_vm->_map->_itemsMap[yPos - 1][xPos] =
+						(_vm->_map->_itemsMap[yPos -
+					1][xPos] & 0xff00) + item;
+			} else {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+						(item << 8);
+
+				_vm->_map->_itemsMap[yPos - 1][xPos] =
+						(_vm->_map->_itemsMap[yPos -
+					1][xPos] & 0xff) + (item << 8);
+			}
+		} else {
+			if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0) {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+						+ item;
+			} else {
+				_vm->_map->_itemsMap[yPos][xPos] =
+						(_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+						(item << 8);
+			}
+		}
+	}
+
+	if (item < 0 || item >= 20)
+		return;
+
+	if (xPos > 1 && _vm->_map->_passMap[yPos][xPos - 2] == 1) {
+		_vm->_map->_itemPoses[item].x = xPos - 2;
+		_vm->_map->_itemPoses[item].y = yPos;
+		_vm->_map->_itemPoses[item].orient = 4;
+		return;
+	}
+
+	if (xPos < Map::kMapWidth - 2 && _vm->_map->_passMap[yPos][xPos + 2] == 1) {
+		_vm->_map->_itemPoses[item].x = xPos + 2;
+		_vm->_map->_itemPoses[item].y = yPos;
+		_vm->_map->_itemPoses[item].orient = 0;
+		return;
+	}
+
+	if (xPos < Map::kMapWidth - 1 && _vm->_map->_passMap[yPos][xPos + 1] == 1) {
+		_vm->_map->_itemPoses[item].x = xPos + 1;
+		_vm->_map->_itemPoses[item].y = yPos;
+		_vm->_map->_itemPoses[item].orient = 0;
+		return;
+	}
+
+	if (xPos > 0 && _vm->_map->_passMap[yPos][xPos - 1] == 1) {
+		_vm->_map->_itemPoses[item].x = xPos - 1;
+		_vm->_map->_itemPoses[item].y = yPos;
+		_vm->_map->_itemPoses[item].orient = 4;
+		return;
+	}
+}
+
 } // End of namespace Gob

Index: inter.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- inter.h	5 Jan 2006 16:06:55 -0000	1.7
+++ inter.h	10 Jan 2006 11:30:23 -0000	1.8
@@ -22,6 +22,8 @@
 #ifndef GOB_INTERPRET_H
 #define GOB_INTERPRET_H
 
+#include "gob/goblin.h"
+
 namespace Gob {
 
 // This is to help devices with small memory (PDA, smartphones, ...)
@@ -57,6 +59,7 @@
 	void callSub(int16 retFlag);
 	void initControlVars(void);
 	void renewTimeInVars(void);
+	void manipulateMap(int16 xPos, int16 yPos, int16 item);
 
 	Inter(GobEngine *vm);
 	virtual ~Inter() {};
@@ -67,8 +70,10 @@
 	virtual void setupOpcodes(void) = 0;
 	virtual void executeDrawOpcode(byte i) = 0;
 	virtual bool executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter, int16 &retFlag) = 0;
+	virtual void executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) = 0;
 	virtual const char *getOpcodeDrawDesc(byte i) = 0;
 	virtual const char *getOpcodeFuncDesc(byte i, byte j) = 0;
+	virtual const char *getOpcodeGoblinDesc(byte i) = 0;
 };
 
 class Inter_v1 : public Inter {
@@ -79,6 +84,7 @@
 protected:
 	typedef void (Inter_v1::*OpcodeDrawProcV1)(void);
 	typedef bool (Inter_v1::*OpcodeFuncProcV1)(char &, int16 &, int16 &);
+	typedef void (Inter_v1::*OpcodeGoblinProcV1)(int16 &, int32 *, Goblin::Gob_Object *);
   struct OpcodeDrawEntryV1 {
 		OpcodeDrawProcV1 proc;
 		const char *desc;
@@ -87,14 +93,22 @@
 		OpcodeFuncProcV1 proc;
 		const char *desc;
 		};
+  struct OpcodeGoblinEntryV1 {
+		OpcodeGoblinProcV1 proc;
+		const char *desc;
+		};
 	const OpcodeDrawEntryV1 *_opcodesDrawV1;
 	const OpcodeFuncEntryV1 *_opcodesFuncV1;
+	const OpcodeGoblinEntryV1 *_opcodesGoblinV1;
+	static const int _goblinFuncLookUp[][2];
 
 	virtual void setupOpcodes(void);
 	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter, int16 &retFlag);
+	virtual void executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
 	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
+	virtual const char *getOpcodeGoblinDesc(byte i);
 
 	void o1_loadMult(void);
 	void o1_playMult(void);
@@ -169,7 +183,7 @@
 	bool o1_return(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_speakerOn(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_speakerOff(char &cmdCount, int16 &counter, int16 &retFlag);
-	bool o1_func(char &cmdCount, int16 &counter, int16 &retFlag);
+	bool o1_goblinFunc(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_returnTo(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_setBackDelta(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_loadSound(char &cmdCount, int16 &counter, int16 &retFlag);
@@ -178,6 +192,76 @@
 	bool o1_animatePalette(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_animateCursor(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o1_blitCursor(char &cmdCount, int16 &counter, int16 &retFlag);
+	void o1_setState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setCurFrame(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setNextState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setMultState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setOrder(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setActionStartState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setCurLookDir(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setType(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setNoTick(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setPickable(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setXPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setYPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setDoAnim(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setRelaxTime(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setMaxTick(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getCurFrame(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getNextState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getMultState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getOrder(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getActionStartState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getCurLookDir(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getType(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getNoTick(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getPickable(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getObjMaxFrame(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getXPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getYPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getDoAnim(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getRelaxTime(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getMaxTick(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_manipulateMap(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getItem(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_manipulateMapIndirect(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getItemIndirect(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setPassMap(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinPosH(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getGoblinPosXH(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getGoblinPosYH(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinMultState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinState(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinStateRedraw(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinUnk14(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setItemIdInPocket(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setItemIndInPocket(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getItemIdInPocket(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getItemIndInPocket(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setItemPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_decRelaxTime(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getGoblinPosX(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getGoblinPosY(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_clearPathExistence(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinVisible(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinInvisible(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getObjectIntersect(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_getGoblinIntersect(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_loadObjects(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_freeObjects(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_animateObjects(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_drawObjects(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_loadMap(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_moveGoblin(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_switchGoblin(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_loadGoblin(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_writeTreatItem(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_moveGoblin0(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinTarget(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_setGoblinObjectsPos(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
+	void o1_initGoblin(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
 };
 
 class Inter_v2 : public Inter_v1 {
@@ -188,6 +272,7 @@
 protected:
 	typedef void (Inter_v2::*OpcodeDrawProcV2)(void);
 	typedef bool (Inter_v2::*OpcodeFuncProcV2)(char &, int16 &, int16 &);
+	typedef void (Inter_v2::*OpcodeGoblinProcV2)(int16 &, int32 *, Goblin::Gob_Object *);
   struct OpcodeDrawEntryV2 {
 		OpcodeDrawProcV2 proc;
 		const char *desc;
@@ -196,14 +281,22 @@
 		OpcodeFuncProcV2 proc;
 		const char *desc;
 		};
+  struct OpcodeGoblinEntryV2 {
+		OpcodeGoblinProcV2 proc;
+		const char *desc;
+		};
 	const OpcodeDrawEntryV2 *_opcodesDrawV2;
 	const OpcodeFuncEntryV2 *_opcodesFuncV2;
+	const OpcodeGoblinEntryV2 *_opcodesGoblinV2;
+	static const int _goblinFuncLookUp[][2];
 
 	virtual void setupOpcodes(void);
 	virtual void executeDrawOpcode(byte i);
 	virtual bool executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter, int16 &retFlag);
+	virtual void executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
 	virtual const char *getOpcodeDrawDesc(byte i);
 	virtual const char *getOpcodeFuncDesc(byte i, byte j);
+	virtual const char *getOpcodeGoblinDesc(byte i);
 
 	void o2_drawStub(void) { warning("Gob2 stub"); }
 };

Index: inter_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter_v1.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- inter_v1.cpp	9 Jan 2006 16:10:22 -0000	1.5
+++ inter_v1.cpp	10 Jan 2006 11:30:23 -0000	1.6
@@ -31,11 +31,86 @@
 #include "gob/goblin.h"
 #include "gob/cdrom.h"
 #include "gob/music.h"
+#include "gob/map.h"
 
 namespace Gob {
 
 #define OPCODE(x) _OPCODE(Inter_v1, x)
 
+const int Inter_v1::_goblinFuncLookUp[][2] = {
+	{1, 0},
[...1035 lines suppressed...]
+	_vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
+			objDesc->xPos, objDesc->yPos, 0);
+
+	objDesc->yPos +=
+			(_vm->_goblin->_gobPositions[0].y * 6 + 5) - _vm->_scenery->_toRedrawBottom;
+
+	if (gobDesc->curLookDir == 4) {
+		objDesc->xPos += _vm->_goblin->_gobPositions[0].x * 12 + 14
+				- (_vm->_scenery->_toRedrawLeft + _vm->_scenery->_toRedrawRight) / 2;
+	} else {
+		objDesc->xPos += _vm->_goblin->_gobPositions[0].x * 12
+				- (_vm->_scenery->_toRedrawLeft + _vm->_scenery->_toRedrawRight) / 2;
+	}
+
+	_vm->_goblin->_itemIndInPocket = -1;
+	_vm->_goblin->_itemIdInPocket = -1;
+	_vm->_util->beep(50);
+}
 
 } // End of namespace Gob

Index: inter_v2.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter_v2.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- inter_v2.cpp	5 Jan 2006 16:06:55 -0000	1.1
+++ inter_v2.cpp	10 Jan 2006 11:30:23 -0000	1.2
@@ -35,6 +35,80 @@
 
 #define OPCODE(x) _OPCODE(Inter_v2, x)
 
+const int Inter_v2::_goblinFuncLookUp[][2] = {
+	{1, 0},
+	{2, 1},
+	{3, 2},
+	{4, 3},
+	{5, 4},
+	{6, 5},
+	{7, 6},
+	{8, 7},
+	{9, 8},
+	{10, 9},
+	{12, 10},
+	{13, 11},
+	{14, 12},
+	{15, 13},
+	{16, 14},
+	{21, 15},
+	{22, 16},
+	{23, 17},
+	{24, 18},
+	{25, 19},
+	{26, 20},
+	{27, 21},
+	{28, 22},
+	{29, 23},
+	{30, 24},
+	{32, 25},
+	{33, 26},
+	{34, 27},
+	{35, 28},
+	{36, 29},
+	{37, 30},
+	{40, 31},
+	{41, 32},
+	{42, 33},
+	{43, 34},
+	{44, 35},
+	{50, 36},
+	{52, 37},
+	{53, 38},
+	{150, 39},
+	{152, 40},
+	{200, 41},
+	{201, 42},
+	{202, 43},
+	{203, 44},
+	{204, 45},
+	{250, 46},
+	{251, 47},
+	{252, 48},
+	{500, 49},
+	{502, 50},
+	{503, 51},
+	{600, 52},
+	{601, 53},
+	{602, 54},
+	{603, 55},
+	{604, 56},
+	{605, 57},
+	{1000, 58},
+	{1001, 59},
+	{1002, 60},
+	{1003, 61},
+	{1004, 62},
+	{1005, 63},
+	{1006, 64},
+	{1008, 65},
+	{1009, 66},
+	{1010, 67},
+	{1011, 68},
+	{1015, 69},
+	{2005, 70}
+};
+
 Inter_v2::Inter_v2(GobEngine *vm) : Inter_v1(vm) {
 	setupOpcodes();
 }
@@ -411,7 +485,7 @@
 		OPCODE(o1_speakerOff),
 		/* 24 */
 		OPCODE(o1_putPixel),
-		OPCODE(o1_func),
+		OPCODE(o1_goblinFunc),
 		OPCODE(o1_createSprite),
 		OPCODE(o1_freeSprite),
 		/* 28 */
@@ -466,8 +540,101 @@
 		OPCODE(o1_manageDataFile),
 	};
 
+	static const OpcodeGoblinEntryV2 opcodesGoblin[71] = {
+		/* 00 */
+		OPCODE(o1_setState),
+		OPCODE(o1_setCurFrame),
+		OPCODE(o1_setNextState),
+		OPCODE(o1_setMultState),
+		/* 04 */
+		OPCODE(o1_setOrder),
+		OPCODE(o1_setActionStartState),
+		OPCODE(o1_setCurLookDir),
+		OPCODE(o1_setType),
+		/* 08 */
+		OPCODE(o1_setNoTick),
+		OPCODE(o1_setPickable),
+		OPCODE(o1_setXPos),
+		OPCODE(o1_setYPos),
+		/* 0C */
+		OPCODE(o1_setDoAnim),
+		OPCODE(o1_setRelaxTime),
+		OPCODE(o1_setMaxTick),
+		OPCODE(o1_getState),
+		/* 10 */
+		OPCODE(o1_getCurFrame),
+		OPCODE(o1_getNextState),
+		OPCODE(o1_getMultState),
+		OPCODE(o1_getOrder),
+		/* 14 */
+		OPCODE(o1_getActionStartState),
+		OPCODE(o1_getCurLookDir),
+		OPCODE(o1_getType),
+		OPCODE(o1_getNoTick),
+		/* 18 */
+		OPCODE(o1_getPickable),
+		OPCODE(o1_getObjMaxFrame),
+		OPCODE(o1_getXPos),
+		OPCODE(o1_getYPos),
+		/* 1C */
+		OPCODE(o1_getDoAnim),
+		OPCODE(o1_getRelaxTime),
+		OPCODE(o1_getMaxTick),
+		OPCODE(o1_manipulateMap),
+		/* 20 */
+		OPCODE(o1_getItem),
+		OPCODE(o1_manipulateMapIndirect),
+		OPCODE(o1_getItemIndirect),
+		OPCODE(o1_setPassMap),
+		/* 24 */
+		OPCODE(o1_setGoblinPosH),
+		OPCODE(o1_getGoblinPosXH),
+		OPCODE(o1_getGoblinPosYH),
+		OPCODE(o1_setGoblinMultState),
+		/* 28 */
+		OPCODE(o1_setGoblinUnk14),
+		OPCODE(o1_setItemIdInPocket),
+		OPCODE(o1_setItemIndInPocket),
+		OPCODE(o1_getItemIdInPocket),
+		/* 2C */
+		OPCODE(o1_getItemIndInPocket),
+		OPCODE(o1_setItemPos),
+		OPCODE(o1_setGoblinPos),
+		OPCODE(o1_setGoblinState),
+		/* 30 */
+		OPCODE(o1_setGoblinStateRedraw),
+		OPCODE(o1_decRelaxTime),
+		OPCODE(o1_getGoblinPosX),
+		OPCODE(o1_getGoblinPosY),
+		/* 34 */
+		OPCODE(o1_clearPathExistence),
+		OPCODE(o1_setGoblinVisible),
+		OPCODE(o1_setGoblinInvisible),
+		OPCODE(o1_getObjectIntersect),
+		/* 38 */
+		OPCODE(o1_getGoblinIntersect),
+		OPCODE(o1_setItemPos),
+		OPCODE(o1_loadObjects),
+		OPCODE(o1_freeObjects),
+		/* 3C */
+		OPCODE(o1_animateObjects),
+		OPCODE(o1_drawObjects),
+		OPCODE(o1_loadMap),
+		OPCODE(o1_moveGoblin),
+		/* 40 */
+		OPCODE(o1_switchGoblin),
+		OPCODE(o1_loadGoblin),
+		OPCODE(o1_writeTreatItem),
+		OPCODE(o1_moveGoblin0),
+		/* 44 */
+		OPCODE(o1_setGoblinTarget),
+		OPCODE(o1_setGoblinObjectsPos),
+		OPCODE(o1_initGoblin)
+	};
+
 	_opcodesDrawV2 = opcodesDraw;
 	_opcodesFuncV2 = opcodesFunc;
+	_opcodesGoblinV2 = opcodesGoblin;
 }
 
 void Inter_v2::executeDrawOpcode(byte i) {
@@ -498,6 +665,26 @@
 	return false;
 }
 
+void Inter_v2::executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
+	debug(4, "opcodeGoblin %d (%s)", i, getOpcodeGoblinDesc(i));
+
+	OpcodeGoblinProcV2 op = NULL;
+
+	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
+		if (_goblinFuncLookUp[j][0] == i) {
+			op = _opcodesGoblinV2[_goblinFuncLookUp[j][1]].proc;
+			break;
+		}
+
+	if (op == NULL) {
+		warning("unimplemented opcodeGoblin: %d", i);
+		_vm->_global->_inter_execPtr -= 2;
+		_vm->_global->_inter_execPtr += load16() * 2;
+	}
+	else
+		(this->*op) (extraData, retVarPtr, objDesc);
+}
+
 const char *Inter_v2::getOpcodeDrawDesc(byte i) {
 	return _opcodesDrawV2[i].desc;
 }
@@ -510,5 +697,11 @@
 	return _opcodesFuncV2[i*16 + j].desc;
 }
 
+const char *Inter_v2::getOpcodeGoblinDesc(byte i) {
+	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
+		if (_goblinFuncLookUp[j][0] == i)
+			return _opcodesGoblinV2[_goblinFuncLookUp[j][1]].desc;
+	return "";
+}
 
 } // End of namespace Gob





More information about the Scummvm-git-logs mailing list