void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct) { Mult::Mult_AnimData *animData = obj->pAnimData; animData->newCycle = _vm->_scenery->getAnimLayer(animData->animation, animData->layer)->framesCount; int16 gobX = obj->goblinX; int16 gobY = obj->goblinY; int16 destX = obj->destX; int16 destY = obj->destY; int16 gobDestX = obj->gobDestX; int16 gobDestY = obj->gobDestY; animData->destX = gobDestX; animData->destY = gobDestY; animData->order = gobY; Direction dir = kDirNone; if (animData->pathExistence == 1) { dir = _vm->_map->getDirection(gobX, gobY, destX, destY); if (dir == kDirNone) animData->pathExistence = 0; if ((gobX == gobDestX) && (gobY == gobDestY)) animData->pathExistence = 4; } else if (animData->pathExistence == 3) { if ((gobX != gobDestX) || (gobY != gobDestY)) { if (_vm->_map->checkDirectPath(obj, gobX, gobY, gobDestX, gobDestY) != 1) { if ((gobX == destX) && (gobY == destY)) { if (obj->nearestWayPoint > obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); destX = wayPoint.x; destY = wayPoint.y; if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; } if (obj->nearestWayPoint > obj->nearestDest) obj->nearestWayPoint--; } else if (obj->nearestWayPoint < obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); destX = wayPoint.x; destY = wayPoint.y; if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; } if (obj->nearestWayPoint < obj->nearestDest) obj->nearestWayPoint++; } else { if ((_vm->_map->checkDirectPath(obj, gobX, gobY, gobDestX, gobDestY) == 3) && (_vm->_map->getPass(gobDestX, gobDestY) != 0)) { const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); destX = wayPoint.x; destY = wayPoint.y; WRITE_VAR(56, 1); } else { animData->pathExistence = 1; destX = gobDestX; destY = gobDestY; } } } } else { destX = gobDestX; destY = gobDestY; } dir = _vm->_map->getDirection(gobX, gobY, destX, destY); } else { animData->pathExistence = 4; destX = gobDestX; destY = gobDestY; } } obj->goblinX = gobX; obj->goblinY = gobY; obj->destX = destX; obj->destY = destY; obj->gobDestX = gobDestX; obj->gobDestY = gobDestY; switch (dir) { case kDirNW: animData->nextState = 1; if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 10) animData->nextState = 40; if (_vm->_map->getPass(obj->goblinX - 1, obj->goblinY - 2) != 10) animData->nextState = 1; } break; case kDirN: animData->nextState = (animData->curLookDir == 2) ? 2 : rotateState(animData->curLookDir, 2); if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 10) { if (_vm->_map->getPass(obj->goblinX - 1, obj->goblinY - 2) == 10) animData->nextState = 40; else if (_vm->_map->getPass(obj->goblinX + 1, obj->goblinY - 2) == 10) animData->nextState = 42; else animData->nextState = 2; } if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 20) animData->nextState = 38; if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 19) animData->nextState = 26; } break; case kDirNE: animData->nextState = 3; if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 10) animData->nextState = 42; if (_vm->_map->getPass(obj->goblinX + 1, obj->goblinY - 2) != 10) animData->nextState = 3; } break; case kDirW: animData->nextState = rotateState(animData->curLookDir, 0); break; case kDirE: animData->nextState = rotateState(animData->curLookDir, 4); break; case kDirSW: animData->nextState = 7; if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 10) animData->nextState = 41; if (_vm->_map->getPass(obj->goblinX - 1, obj->goblinY + 2) != 10) animData->nextState = 7; } break; case kDirS: animData->nextState = (animData->curLookDir == 6) ? 6 : rotateState(animData->curLookDir, 6); if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 20) animData->nextState = 39; if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 19) animData->nextState = 27; } break; case kDirSE: animData->nextState = 5; if (_vm->_map->getScreenWidth() == 640) { if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 10) animData->nextState = 43; if (_vm->_map->getPass(obj->goblinX + 1, obj->goblinY + 2) != 10) animData->nextState = 5; } break; default: if (animData->curLookDir == 0) animData->nextState = 8; else if (animData->curLookDir == 2) animData->nextState = 29; else if (animData->curLookDir == 4) animData->nextState = 9; else if (animData->curLookDir == 6) animData->nextState = 28; break; } }
void Goblin_v1::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct) { if (_pathExistence == 1) { _vm->_map->_curGoblinX = _gobPositions[_currentGoblin].x; _vm->_map->_curGoblinY = _gobPositions[_currentGoblin].y; if (_vm->_map->_curGoblinX == _pressedMapX && _vm->_map->_curGoblinY == _pressedMapY && _gobAction != 0) { _readyToAct = 1; _pathExistence = 0; } nextAct = _vm->_map->getDirection(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY, _vm->_map->_destX, _vm->_map->_destY); if (nextAct == 0) _pathExistence = 0; } else if (_pathExistence == 3) { _vm->_map->_curGoblinX = _gobPositions[_currentGoblin].x; _vm->_map->_curGoblinY = _gobPositions[_currentGoblin].y; if (_vm->_map->_curGoblinX == _gobDestX && _vm->_map->_curGoblinY == _gobDestY) { _pathExistence = 1; _vm->_map->_destX = _pressedMapX; _vm->_map->_destY = _pressedMapY; } else { if (_vm->_map->checkDirectPath(0, _vm->_map->_curGoblinX, _vm->_map->_curGoblinY, _gobDestX, _gobDestY) == 1) { _vm->_map->_destX = _gobDestX; _vm->_map->_destY = _gobDestY; } else if (_vm->_map->_curGoblinX == _vm->_map->_destX && _vm->_map->_curGoblinY == _vm->_map->_destY) { if (_vm->_map->_nearestWayPoint > _vm->_map->_nearestDest) { _vm->_map->optimizePoints(0, 0, 0); _vm->_map->_destX = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint]. x; _vm->_map->_destY = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint]. y; if (_vm->_map->_nearestWayPoint > _vm->_map->_nearestDest) _vm->_map->_nearestWayPoint--; } else if (_vm->_map->_nearestWayPoint < _vm->_map->_nearestDest) { _vm->_map->optimizePoints(0, 0, 0); _vm->_map->_destX = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint]. x; _vm->_map->_destY = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint]. y; if (_vm->_map->_nearestWayPoint < _vm->_map->_nearestDest) _vm->_map->_nearestWayPoint++; } else { if (_vm->_map->checkDirectPath(0, _vm->_map->_curGoblinX, _vm->_map->_curGoblinY, _gobDestX, _gobDestY) == 3 && _vm->_map->getPass(_pressedMapX, _pressedMapY) != 0) { _vm->_map->_destX = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].x; _vm->_map->_destY = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].y; } else { _pathExistence = 1; _vm->_map->_destX = _pressedMapX; _vm->_map->_destY = _pressedMapY; } } } nextAct = _vm->_map->getDirection(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY, _vm->_map->_destX, _vm->_map->_destY); } } if (_readyToAct != 0 && (_gobAction == 3 || _gobAction == 4)) nextAct = 0x4dc8; switch (nextAct) { case Map::kDirW: gobDesc->nextState = rotateState(gobDesc->curLookDir, 0); break; case Map::kDirE: gobDesc->nextState = rotateState(gobDesc->curLookDir, 4); break; case 16: gobDesc->nextState = 16; break; case 23: gobDesc->nextState = 23; break; case Map::kDirN: if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY - 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 3) { gobDesc->nextState = 8; break; } if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 6 && _currentGoblin == 1) { gobDesc->nextState = 28; break; } gobDesc->nextState = rotateState(gobDesc->curLookDir, 2); break; case Map::kDirS: if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY + 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 3) { gobDesc->nextState = 9; break; } if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 6 && _currentGoblin == 1) { gobDesc->nextState = 29; break; } gobDesc->nextState = rotateState(gobDesc->curLookDir, 6); break; case Map::kDirSE: if (_vm->_map->getPass(_vm->_map->_curGoblinX + 1, _vm->_map->_curGoblinY + 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } gobDesc->nextState = 5; if (gobDesc->curLookDir == 4) break; gobDesc->nextState = rotateState(gobDesc->curLookDir, 4); break; case Map::kDirSW: if (_vm->_map->getPass(_vm->_map->_curGoblinX - 1, _vm->_map->_curGoblinY + 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } gobDesc->nextState = 7; if (gobDesc->curLookDir == 0) break; gobDesc->nextState = rotateState(gobDesc->curLookDir, 0); break; case Map::kDirNW: if (_vm->_map->getPass(_vm->_map->_curGoblinX - 1, _vm->_map->_curGoblinY - 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } gobDesc->nextState = 1; if (gobDesc->curLookDir == 0) break; gobDesc->nextState = rotateState(gobDesc->curLookDir, 0); break; case Map::kDirNE: if (_vm->_map->getPass(_vm->_map->_curGoblinX + 1, _vm->_map->_curGoblinY - 1) == 6 && _currentGoblin != 1) { _pathExistence = 0; break; } gobDesc->nextState = 3; if (gobDesc->curLookDir == 4) break; gobDesc->nextState = rotateState(gobDesc->curLookDir, 4); break; case 0x4dc8: if (_currentGoblin == 0 && _gobAction == 3 && _itemIndInPocket == -1) { _destItemId = -1; _readyToAct = 0; break; } if (_currentGoblin == 0 && _gobAction == 4 && _itemIndInPocket == -1 && _destActionItem == 0) { gobDesc->multState = 104; _destItemId = -1; _readyToAct = 0; break; } if (_currentGoblin == 0 && _gobAction == 4 && _itemIndInPocket == -1 && _destActionItem != 0 && _itemToObject[_destActionItem] != -1 && _objects[_itemToObject[_destActionItem]]-> pickable == 0) { gobDesc->multState = 104; _destItemId = -1; _readyToAct = 0; break; } switch (_vm->_map->_itemPoses[_destActionItem].orient) { case 0: case -4: gobDesc->nextState = 10; gobDesc->curLookDir = 0; _destItemId = -1; break; case -1: case 4: gobDesc->nextState = 11; gobDesc->curLookDir = 4; _destItemId = -1; break; } break; default: if (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 3 || (_vm->_map->getPass(_vm->_map->_curGoblinX, _vm->_map->_curGoblinY) == 6 && _currentGoblin == 1)) { gobDesc->nextState = 20; break; } switch (gobDesc->curLookDir) { case 2: case 4: gobDesc->nextState = 18; break; case 6: case 0: gobDesc->nextState = 19; break; } break; } return; }