[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