diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index a82fe9569dfc..77e21fbf8d90 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -942,8 +942,27 @@ void PrinceEngine::showBackAnims() { int phaseFrameIndex = _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseFrameIndex(phase); int x = _backAnimList[i].backAnims[activeSubAnim]._x + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetX(phase); int y = _backAnimList[i].backAnims[activeSubAnim]._y + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetY(phase); + int animFlag = _backAnimList[i].backAnims[activeSubAnim]._flags; + int checkMaskFlag = (animFlag & 1); + int maxFrontFlag = (animFlag & 2); + int specialZFlag = _backAnimList[i].backAnims[activeSubAnim]._nextAnim; + int z = _backAnimList[i].backAnims[activeSubAnim]._nextAnim; + int frameWidth = _backAnimList[i].backAnims[activeSubAnim]._animData->getFrameWidth(phaseFrameIndex); + int frameHeight = _backAnimList[i].backAnims[activeSubAnim]._animData->getFrameHeight(phaseFrameIndex); if (x != 0 || y != 0 || phaseCount != 1 || frameCount != 1) { // fix for room no. 5 - animation 8 (propably unnecessary anim) + if (checkMaskFlag != 0) { + if (_backAnimList[i].backAnims[activeSubAnim]._nextAnim == 0) { + z = y + frameHeight - 1; + } + checkMasks(x, y, frameWidth, frameHeight, z); + } + if (maxFrontFlag != 0) { + z = kMaxPicHeight + 1; + } + if (specialZFlag != 0) { + z = specialZFlag; + } Graphics::Surface *backAnimSurface = _backAnimList[i].backAnims[activeSubAnim]._animData->getFrame(phaseFrameIndex); //still with memory leak showSprite(backAnimSurface, x, y); backAnimSurface->free(); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 15dfdb4b7b21..b9e61f67d3a9 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -244,6 +244,8 @@ class PrinceEngine : public Engine { static const int16 kNormalWidth = 640; static const int16 kNormalHeight = 480; + static const int16 kMaxPicWidth = 1280; + static const int16 kMaxPicHeight = 480; void checkMasks(int x1, int y1, int sprWidth, int sprHeight, int z); void insertMasks(const Graphics::Surface *originalRoomSurface);