diff options
Diffstat (limited to 'engines/gob/goblin_v2.cpp')
-rw-r--r-- | engines/gob/goblin_v2.cpp | 302 |
1 files changed, 165 insertions, 137 deletions
diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp index 2747750abb..503377c19b 100644 --- a/engines/gob/goblin_v2.cpp +++ b/engines/gob/goblin_v2.cpp @@ -39,10 +39,10 @@ namespace Gob { Goblin_v2::Goblin_v2(GobEngine *vm) : Goblin_v1(vm) { _gobsCount = -1; - _rotStates[0][0] = 0; _rotStates[0][1] = 18; _rotStates[0][2] = 19; _rotStates[0][3] = 20; - _rotStates[1][0] = 13; _rotStates[1][1] = 2; _rotStates[1][2] = 12; _rotStates[1][3] = 14; - _rotStates[2][0] = 16; _rotStates[2][1] = 15; _rotStates[2][2] = 4; _rotStates[2][3] = 17; - _rotStates[3][0] = 23; _rotStates[3][1] = 21; _rotStates[3][2] = 22; _rotStates[3][3] = 6; + _rotStates[0][0] = 0; _rotStates[0][1] = 18; _rotStates[0][2] = 19; _rotStates[0][3] = 20; + _rotStates[1][0] = 13; _rotStates[1][1] = 2; _rotStates[1][2] = 12; _rotStates[1][3] = 14; + _rotStates[2][0] = 16; _rotStates[2][1] = 15; _rotStates[2][2] = 4; _rotStates[2][3] = 17; + _rotStates[3][0] = 23; _rotStates[3][1] = 21; _rotStates[3][2] = 22; _rotStates[3][3] = 6; } void Goblin_v2::freeObjects() { @@ -80,13 +80,13 @@ void Goblin_v2::placeObject(Gob_Object *objDesc, char animated, objAnim->newCycle = 0; _vm->_scenery->updateAnim(objAnim->layer, 0, objAnim->animation, 0, *obj->pPosX, *obj->pPosY, 0); - if (!_vm->_map->_bigTiles) - *obj->pPosY = (y + 1) * _vm->_map->_tilesHeight + if (!_vm->_map->hasBigTiles()) + *obj->pPosY = (y + 1) * _vm->_map->getTilesHeight() - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); else - *obj->pPosY = ((y + 1) * _vm->_map->_tilesHeight) - + *obj->pPosY = ((y + 1) * _vm->_map->getTilesHeight()) - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop) - (y + 1) / 2; - *obj->pPosX = x * _vm->_map->_tilesWidth; + *obj->pPosX = x * _vm->_map->getTilesWidth(); } else { if ((obj->goblinStates != 0) && (obj->goblinStates[state] != 0)) { layer = obj->goblinStates[state][0].layer; @@ -99,13 +99,13 @@ void Goblin_v2::placeObject(Gob_Object *objDesc, char animated, objAnim->isStatic = 0; objAnim->newCycle = _vm->_scenery->getAnimLayer(animation, layer)->framesCount; _vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0); - if (!_vm->_map->_bigTiles) - *obj->pPosY = (y + 1) * _vm->_map->_tilesHeight + if (!_vm->_map->hasBigTiles()) + *obj->pPosY = (y + 1) * _vm->_map->getTilesHeight() - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); else - *obj->pPosY = ((y + 1) * _vm->_map->_tilesHeight) - + *obj->pPosY = ((y + 1) * _vm->_map->getTilesHeight()) - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop) - (y + 1) / 2; - *obj->pPosX = x * _vm->_map->_tilesWidth; + *obj->pPosX = x * _vm->_map->getTilesWidth(); initiateMove(obj); } else initiateMove(obj); @@ -121,54 +121,55 @@ void Goblin_v2::initiateMove(Mult::Mult_Object *obj) { obj->pAnimData->pathExistence = _vm->_map->checkDirectPath(obj, obj->goblinX, obj->goblinY, obj->gobDestX, obj->gobDestY); if (obj->pAnimData->pathExistence == 3) { - obj->destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - obj->destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + obj->destX = wayPoint.x; + obj->destY = wayPoint.y; } } void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct) { - Mult::Mult_AnimData *animData; - int16 framesCount; - int16 gobX; - int16 gobY; - int16 gobDestX; - int16 gobDestY; - int16 destX; - int16 destY; - int16 dir; - - dir = 0; - animData = obj->pAnimData; - framesCount = _vm->_scenery->getAnimLayer(animData->animation, animData->layer)->framesCount; - animData->newCycle = framesCount; - gobX = obj->goblinX; - gobY = obj->goblinY; - animData->order = gobY; - gobDestX = obj->gobDestX; - gobDestY = obj->gobDestY; + 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; - destX = obj->destX; - destY = obj->destY; + animData->order = gobY; + + Direction dir = kDirNone; if (animData->pathExistence == 1) { + dir = _vm->_map->getDirection(gobX, gobY, destX, destY); - if (dir == 0) + if (dir == kDirNone) animData->pathExistence = 0; - if ((gobX == destX) && (gobY == destY)) + if ((gobX == gobDestX) && (gobY == gobDestY)) animData->pathExistence = 4; + } else if (animData->pathExistence == 3) { - if ((gobX == gobDestX) && (gobY == gobDestY)) { - animData->pathExistence = 4; - destX = gobDestX; - destY = gobDestY; - } else { + + 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); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + 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; @@ -177,8 +178,12 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 obj->nearestWayPoint--; } else if (obj->nearestWayPoint < obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + 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; @@ -188,8 +193,12 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } else { if ((_vm->_map->checkDirectPath(obj, gobX, gobY, gobDestX, gobDestY) == 3) && (_vm->_map->getPass(gobDestX, gobDestY) != 0)) { - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + WRITE_VAR(56, 1); } else { animData->pathExistence = 1; @@ -197,26 +206,35 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 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->gobDestX = gobDestX; - obj->gobDestY = gobDestY; - obj->destX = destX; - obj->destY = destY; + obj->goblinX = gobX; + obj->goblinY = gobY; + obj->destX = destX; + obj->destY = destY; + obj->gobDestX = gobDestX; + obj->gobDestY = gobDestY; switch (dir) { - case Map::kDirNW: + case kDirNW: animData->nextState = 1; - if (_vm->_map->_screenWidth == 640) { + 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) @@ -224,28 +242,29 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } break; - case Map::kDirN: + case kDirN: animData->nextState = (animData->curLookDir == 2) ? 2 : rotateState(animData->curLookDir, 2); - if (_vm->_map->_screenWidth == 640) { + 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) { - if (_vm->_map->getPass(obj->goblinX + 1, obj->goblinY - 2) == 10) - animData->nextState = 42; - else - animData->nextState = 2; - } else + if (_vm->_map->getPass(obj->goblinX - 1, obj->goblinY - 2) == 10) animData->nextState = 40; - } else if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 20) + 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; - else if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 19) + if (_vm->_map->getPass(obj->goblinX, obj->goblinY) == 19) animData->nextState = 26; } break; - case Map::kDirNE: - animData->nextState = 3; - if (_vm->_map->_screenWidth == 640) { + 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) @@ -253,17 +272,17 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } break; - case Map::kDirW: + case kDirW: animData->nextState = rotateState(animData->curLookDir, 0); break; - case Map::kDirE: + case kDirE: animData->nextState = rotateState(animData->curLookDir, 4); break; - case Map::kDirSW: + case kDirSW: animData->nextState = 7; - if (_vm->_map->_screenWidth == 640) { + 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) @@ -271,10 +290,10 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } break; - case Map::kDirS: + case kDirS: animData->nextState = (animData->curLookDir == 6) ? 6 : rotateState(animData->curLookDir, 6); - if (_vm->_map->_screenWidth == 640) { + 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) @@ -282,9 +301,9 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } break; - case Map::kDirSE: + case kDirSE: animData->nextState = 5; - if (_vm->_map->_screenWidth == 640) { + 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) @@ -293,7 +312,7 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 break; default: - if (animData->curLookDir == 0) + if (animData->curLookDir == 0) animData->nextState = 8; else if (animData->curLookDir == 2) animData->nextState = 29; @@ -307,12 +326,6 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct, int16 framesCount) { - Mult::Mult_AnimData *animData; - int16 gobX; - int16 gobY; - int16 animation; - int16 state; - int16 layer; if (!obj->goblinStates) return; @@ -320,7 +333,7 @@ void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, movePathFind(obj, 0, 0); playSounds(obj); - animData = obj->pAnimData; + Mult::Mult_AnimData *animData = obj->pAnimData; framesCount = _vm->_scenery->getAnimLayer(animData->animation, animData->layer)->framesCount; @@ -395,72 +408,87 @@ void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, } if ((animData->newState != -1) && (animData->frame == framesCount) && - (animData->newState != animData->state)) { + (animData->newState != animData->state)) { + animData->nextState = animData->newState; - animData->newState = -1; - animData->state = animData->nextState; + animData->newState = -1; + animData->state = animData->nextState; Scenery::AnimLayer *animLayer = _vm->_scenery->getAnimLayer(animData->animation, animData->layer); + *obj->pPosX += animLayer->animDeltaX; *obj->pPosY += animLayer->animDeltaY; - animation = obj->goblinStates[animData->nextState][0].animation; - layer = obj->goblinStates[animData->nextState][0].layer; - animData->layer = layer; + int16 animation = obj->goblinStates[animData->nextState][0].animation; + int16 layer = obj->goblinStates[animData->nextState][0].layer; + + animData->layer = layer; animData->animation = animation; - animData->frame = 0; - } else { - if (isMovement(animData->state)) { - state = animData->nextState; - if (animData->frame == ((framesCount + 1) / 2)) { - gobX = obj->goblinX; - gobY = obj->goblinY; - - advMovement(obj, state); - - if (animData->state != state) { - animation = obj->goblinStates[state][0].animation; - layer = obj->goblinStates[state][0].layer; - animData->layer = layer; - animData->animation = animation; - animData->frame = 0; - animData->state = state; - _vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0); - if (_vm->_map->_bigTiles) - *obj->pPosY = ((gobY + 1) * _vm->_map->_tilesHeight) - - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop) - (gobY + 1) / 2; - else - *obj->pPosY = ((gobY + 1) * _vm->_map->_tilesHeight) - - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); - *obj->pPosX = gobX * _vm->_map->_tilesWidth; - } - } - } + animData->frame = 0; - if (animData->frame >= framesCount) { - state = animData->nextState; - animation = obj->goblinStates[state][0].animation; - layer = obj->goblinStates[state][0].layer; - animData->layer = layer; - animData->animation = animation; - animData->frame = 0; - animData->state = state; - gobX = obj->goblinX; - gobY = obj->goblinY; + return; + } + + if (isMovement(animData->state)) { + int16 state = animData->nextState; + + if (animData->frame == ((framesCount + 1) / 2)) { + int16 gobX = obj->goblinX; + int16 gobY = obj->goblinY + 1; advMovement(obj, state); - _vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0); - if (_vm->_map->_bigTiles) - *obj->pPosY = ((gobY + 1) * _vm->_map->_tilesHeight) - - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop) - (gobY + 1) / 2; - else - *obj->pPosY = ((gobY + 1) * _vm->_map->_tilesHeight) - - (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); - *obj->pPosX = gobX * _vm->_map->_tilesWidth; + if (animData->state != state) { + int16 animation = obj->goblinStates[state][0].animation; + int16 layer = obj->goblinStates[state][0].layer; + + animData->layer = layer; + animData->animation = animation; + animData->frame = 0; + animData->state = state; + + _vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0); + uint32 gobPosX = gobX * _vm->_map->getTilesWidth(); + uint32 gobPosY = (gobY * _vm->_map->getTilesHeight()) - + (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); + + if (_vm->_map->hasBigTiles()) + gobPosY -= gobY / 2; + + *obj->pPosX = gobPosX; + *obj->pPosY = gobPosY; + } } } + + if (animData->frame < framesCount) + return; + + int16 state = animData->nextState; + int16 animation = obj->goblinStates[state][0].animation; + int16 layer = obj->goblinStates[state][0].layer; + + animData->layer = layer; + animData->animation = animation; + animData->frame = 0; + animData->state = state; + + int16 gobX = obj->goblinX; + int16 gobY = obj->goblinY + 1; + + advMovement(obj, state); + + _vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0); + uint32 gobPosX = gobX * _vm->_map->getTilesWidth(); + uint32 gobPosY = (gobY * _vm->_map->getTilesHeight()) - + (_vm->_scenery->_animBottom - _vm->_scenery->_animTop); + + if (_vm->_map->hasBigTiles()) + gobPosY -= gobY / 2; + + *obj->pPosX = gobPosX; + *obj->pPosY = gobPosY; } void Goblin_v2::handleGoblins() { |