diff options
-rw-r--r-- | engines/mohawk/riven_graphics.cpp | 20 | ||||
-rw-r--r-- | engines/mohawk/riven_graphics.h | 7 | ||||
-rw-r--r-- | engines/mohawk/riven_stack.cpp | 19 |
3 files changed, 34 insertions, 12 deletions
diff --git a/engines/mohawk/riven_graphics.cpp b/engines/mohawk/riven_graphics.cpp index ac42b1207a..bc6ebfc382 100644 --- a/engines/mohawk/riven_graphics.cpp +++ b/engines/mohawk/riven_graphics.cpp @@ -316,7 +316,7 @@ RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) : _enableCardUpdateScript(true), _scheduledTransition(kRivenTransitionNone), _dirtyScreen(false), - _creditsImage(302), + _creditsImage(kRivenCreditsZeroImage), _creditsPos(0), _transitionMode(kRivenTransitionModeFastest), _transitionOffset(-1), @@ -657,7 +657,7 @@ void RivenGraphics::beginCredits() { clearCache(); // Now cache all the credits images - for (uint16 i = 302; i <= 320; i++) { + for (uint16 i = kRivenCreditsZeroImage; i <= kRivenCreditsLastImage; i++) { MohawkSurface *surface = _bitmapDecoder->decodeImage(_vm->getExtrasResource(ID_TBMP, i)); surface->convertToTrueColor(); addImageToCache(i, surface); @@ -669,32 +669,32 @@ void RivenGraphics::beginCredits() { } void RivenGraphics::updateCredits() { - if ((_creditsImage == 303 || _creditsImage == 304) && _creditsPos == 0) + if ((_creditsImage == kRivenCreditsFirstImage || _creditsImage == kRivenCreditsSecondImage) && _creditsPos == 0) fadeToBlack(); - if (_creditsImage < 304) { + if (_creditsImage < kRivenCreditsSecondImage) { // For the first two credit images, they are faded from black to the image and then out again scheduleTransition(kRivenTransitionBlend); Graphics::Surface *frame = findImage(_creditsImage++)->getSurface(); - for (int y = 0; y < frame->h; y++) memcpy(_mainScreen->getBasePtr(124, y), frame->getBasePtr(0, y), frame->pitch); runScheduledTransition(); } else { // Otheriwse, we're scrolling + // This is done by 1) moving the screen up one row and + // 2) adding a new row at the bottom that is the current row of the current image or + // not and it defaults to being empty (a black row). + // Move the screen up one row memmove(_mainScreen->getPixels(), _mainScreen->getBasePtr(0, 1), _mainScreen->pitch * (_mainScreen->h - 1)); - // Only update as long as we're not before the last frame - // Otherwise, we're just moving up a row (which we already did) - if (_creditsImage <= 320) { - // Copy the next row to the bottom of the screen + // Copy the next row to the bottom of the screen and keep incrementing the credit images and which row we are on until we reach the last. + if (_creditsImage <= kRivenCreditsLastImage) { Graphics::Surface *frame = findImage(_creditsImage)->getSurface(); memcpy(_mainScreen->getBasePtr(124, _mainScreen->h - 1), frame->getBasePtr(0, _creditsPos), frame->pitch); _creditsPos++; - if (_creditsPos == _mainScreen->h) { _creditsImage++; _creditsPos = 0; diff --git a/engines/mohawk/riven_graphics.h b/engines/mohawk/riven_graphics.h index 467dfb572c..845fbf25a1 100644 --- a/engines/mohawk/riven_graphics.h +++ b/engines/mohawk/riven_graphics.h @@ -58,6 +58,13 @@ enum RivenTransitionMode { kRivenTransitionModeBest = 5003 }; +enum RivenCreditsImageNumber { + kRivenCreditsZeroImage = 302, + kRivenCreditsFirstImage = 303, + kRivenCreditsSecondImage = 304, + kRivenCreditsLastImage = 320 +}; + class RivenGraphics : public GraphicsManager { public: explicit RivenGraphics(MohawkEngine_Riven *vm); diff --git a/engines/mohawk/riven_stack.cpp b/engines/mohawk/riven_stack.cpp index cecb557385..abe7e5a903 100644 --- a/engines/mohawk/riven_stack.cpp +++ b/engines/mohawk/riven_stack.cpp @@ -237,7 +237,7 @@ void RivenStack::runCredits(uint16 video, uint32 delay, uint32 videoFrameCountOv frameCount = videoPtr->getFrameCount(); } - while (!_vm->hasGameEnded() && _vm->_gfx->getCurCreditsImage() <= 320) { + while (!_vm->hasGameEnded() && _vm->_gfx->getCurCreditsImage() <= kRivenCreditsLastImage) { if (videoPtr->getCurFrame() >= frameCount - 1) { if (nextCreditsFrameStart == 0) { videoPtr->disable(); @@ -246,7 +246,7 @@ void RivenStack::runCredits(uint16 video, uint32 delay, uint32 videoFrameCountOv } else if (_vm->getTotalPlayTime() >= nextCreditsFrameStart) { // the first two frames stay on for 4 seconds // the rest of the scroll updates happen at 60Hz - if (_vm->_gfx->getCurCreditsImage() < 304) + if (_vm->_gfx->getCurCreditsImage() < kRivenCreditsSecondImage) nextCreditsFrameStart = _vm->getTotalPlayTime() + 4000; else nextCreditsFrameStart = _vm->getTotalPlayTime() + 1000 / 60; @@ -258,6 +258,21 @@ void RivenStack::runCredits(uint16 video, uint32 delay, uint32 videoFrameCountOv _vm->doFrame(); } + // Let the last frame of credits keep scrolling till black + uint currFrameTime = _vm->getTotalPlayTime(); + nextCreditsFrameStart = currFrameTime + 1000 / 60; + uint endFrameTime = currFrameTime + 8000; // 8 seconds + uint sleepTime = 0; + + while(currFrameTime < endFrameTime) { + if (sleepTime > 0) + _vm->delay(sleepTime); + nextCreditsFrameStart += 1000 / 60; + _vm->_gfx->updateCredits(); + _vm->doFrame(); + currFrameTime = _vm->getTotalPlayTime(); + sleepTime = nextCreditsFrameStart - currFrameTime; + } _vm->setGameEnded(); } |