void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct, int16 framesCount) { if (!obj->goblinStates) return; movePathFind(obj, 0, 0); playSounds(obj); Mult::Mult_AnimData *animData = obj->pAnimData; framesCount = _vm->_scenery->getAnimLayer(animData->animation, animData->layer)->framesCount; if (animData->isPaused == 0) animData->frame++; switch (animData->stateType) { case 0: case 1: animData->isPaused = 0; break; case 4: if (animData->frame == 0) animData->isPaused = 1; break; case 6: if (animData->frame >= framesCount) animData->isPaused = 1; break; } switch (animData->state) { case 0: case 1: case 7: case 13: case 16: case 23: case 40: case 41: animData->curLookDir = 0; break; case 2: case 15: case 18: case 21: case 26: case 38: animData->curLookDir = 2; break; case 3: case 4: case 5: case 12: case 19: case 22: case 42: case 43: animData->curLookDir = 4; break; case 6: case 14: case 17: case 20: case 27: case 39: animData->curLookDir = 6; break; case 8: case 9: case 28: case 29: if (animData->pathExistence == 4) animData->pathExistence = 5; break; } if ((animData->newState != -1) && (animData->frame == framesCount) && (animData->newState != animData->state)) { animData->nextState = animData->newState; 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; 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; 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); 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_v1::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct, int16 framesCount) { int16 i; int16 newX; int16 newY; int16 flag; movePathFind(0, gobDesc, nextAct); gobDesc->curFrame++; if (gobDesc->curFrame == 1) gobDesc->actionStartState = gobDesc->state; if (_goesAtTarget == 0 && gobDesc->stateMach == gobDesc->realStateMach) { switch (gobDesc->state) { case 0: case 1: case 7: case 13: case 16: case 27: gobDesc->curLookDir = 0; break; case 3: case 4: case 5: case 12: case 23: case 26: gobDesc->curLookDir = 4; break; case 28: if (_currentGoblin != 1) break; gobDesc->curLookDir = 2; break; case 2: case 8: case 15: case 22: case 25: gobDesc->curLookDir = 2; break; case 29: if (_currentGoblin != 1) break; gobDesc->curLookDir = 6; break; case 6: case 9: case 14: case 17: case 24: gobDesc->curLookDir = 6; break; } } if (gobDesc->state >= 0 && gobDesc->state < 10 && gobDesc->stateMach == gobDesc->realStateMach && (gobDesc->curFrame == 3 || gobDesc->curFrame == 6)) { _vm->_snd->speakerOn(10 * _vm->_util->getRandom(3) + 50, 5); } if (_currentGoblin == 0 && gobDesc->stateMach == gobDesc->realStateMach && (gobDesc->state == 10 || gobDesc->state == 11) && gobDesc->curFrame == 9) { _vm->_snd->stopSound(0); if (_itemIndInPocket != -1) { _vm->_snd->playSample(_soundData[14], 1, 9000); } if (_itemIndInPocket == -1) { _vm->_snd->playSample(_soundData[14], 1, 5000); } } if (_boreCounter++ == 120) { _boreCounter = 0; for (i = 0; i < 3; i++) showBoredom(i); } if (gobDesc->multState != -1 && gobDesc->curFrame == framesCount && gobDesc->state != gobDesc->multState) { gobDesc->nextState = gobDesc->multState; gobDesc->multState = -1; newX = _vm->_scenery->_animations[gobDesc->animation]. layers[_gobStateLayer].animDeltaX + gobDesc->xPos; newY = _vm->_scenery->_animations[gobDesc->animation]. layers[_gobStateLayer].animDeltaY + gobDesc->yPos; _gobStateLayer = nextLayer(gobDesc); gobDesc->xPos = newX; gobDesc->yPos = newY; } else { if (gobDesc->curFrame == 3 && gobDesc->stateMach == gobDesc->realStateMach && (gobDesc->state < 10 || (_currentGoblin == 1 && (gobDesc->state == 28 || gobDesc->state == 29)) )) { flag = 0; if (_forceNextState[0] != -1) { gobDesc->nextState = _forceNextState[0]; for (i = 0; i < 9; i++) _forceNextState[i] = _forceNextState[i + 1]; } _vm->_map->_curGoblinX = _gobPositions[_currentGoblin].x; _vm->_map->_curGoblinY = _gobPositions[_currentGoblin].y; if (gobDesc->nextState != gobDesc->state) { _gobStateLayer = nextLayer(gobDesc); flag = 1; } switch (gobDesc->state) { case 0: _gobPositions[_currentGoblin].x--; break; case 2: case 8: _gobPositions[_currentGoblin].y--; break; case 4: _gobPositions[_currentGoblin].x++; break; case 6: case 9: _gobPositions[_currentGoblin].y++; break; case 1: _gobPositions[_currentGoblin].x--; _gobPositions[_currentGoblin].y--; break; case 3: _gobPositions[_currentGoblin].x++; _gobPositions[_currentGoblin].y--; break; case 5: _gobPositions[_currentGoblin].x++; _gobPositions[_currentGoblin].y++; break; case 7: _gobPositions[_currentGoblin].x--; _gobPositions[_currentGoblin].y++; break; case 38: _gobPositions[_currentGoblin].y++; break; } if (_currentGoblin == 1) { if (gobDesc->state == 28) _gobPositions[1].y--; if (gobDesc->state == 29) _gobPositions[1].y++; } if (flag != 0) { _vm->_scenery->updateAnim(_gobStateLayer, 0, gobDesc->animation, 0, gobDesc->xPos, gobDesc->yPos, 0); gobDesc->yPos = (_vm->_map->_curGoblinY + 1) * 6 - (_vm->_scenery->_toRedrawBottom - _vm->_scenery->_animTop); gobDesc->xPos = _vm->_map->_curGoblinX * 12 - (_vm->_scenery->_toRedrawLeft - _vm->_scenery->_animLeft); } if ((gobDesc->state == 10 || gobDesc->state == 11) && _currentGoblin != 0) _goesAtTarget = 1; } if (gobDesc->curFrame != framesCount) return; if (_forceNextState[0] != -1) { gobDesc->nextState = _forceNextState[0]; for (i = 0; i < 10; i++) _forceNextState[i] = _forceNextState[i + 1]; } _vm->_map->_curGoblinX = _gobPositions[_currentGoblin].x; _vm->_map->_curGoblinY = _gobPositions[_currentGoblin].y; _gobStateLayer = nextLayer(gobDesc); if (gobDesc->stateMach == gobDesc->realStateMach) { switch (gobDesc->nextState) { case 0: _gobPositions[_currentGoblin].x--; break; case 2: case 8: _gobPositions[_currentGoblin].y--; break; case 4: _gobPositions[_currentGoblin].x++; break; case 6: case 9: _gobPositions[_currentGoblin].y++; break; case 1: _gobPositions[_currentGoblin].x--; _gobPositions[_currentGoblin].y--; break; case 3: _gobPositions[_currentGoblin].x++; _gobPositions[_currentGoblin].y--; break; case 5: _gobPositions[_currentGoblin].x++; _gobPositions[_currentGoblin].y++; break; case 7: _gobPositions[_currentGoblin].x--; _gobPositions[_currentGoblin].y++; break; case 38: _gobPositions[_currentGoblin].y++; break; } if (_currentGoblin == 1) { if (gobDesc->nextState == 28) _gobPositions[1].y--; if (gobDesc->nextState == 29) _gobPositions[1].y++; } } _vm->_scenery->updateAnim(_gobStateLayer, 0, gobDesc->animation, 0, gobDesc->xPos, gobDesc->yPos, 0); gobDesc->yPos = (_vm->_map->_curGoblinY + 1) * 6 - (_vm->_scenery->_toRedrawBottom - _vm->_scenery->_animTop); gobDesc->xPos = _vm->_map->_curGoblinX * 12 - (_vm->_scenery->_toRedrawLeft - _vm->_scenery->_animLeft); if ((gobDesc->state == 10 || gobDesc->state == 11) && _currentGoblin != 0) _goesAtTarget = 1; } return; }