MOHAWK: MYST: Fix flyby movies to behave more like the original

* Keep playing the previously running background sound while playing the
  flyby.
* Don't play the flyby after loading a save.
* Play the flyby before both linking sounds.

Fixes #10482, Fixes #10483.
This commit is contained in:
Bastien Bouclet 2018-04-10 19:54:02 +02:00
parent 58d4f11f8f
commit 3a8655bc81
2 changed files with 47 additions and 40 deletions

View File

@ -262,8 +262,38 @@ void MohawkEngine_Myst::playMovieBlocking(const Common::String &name, MystStack
waitUntilMovieEnds(video); waitUntilMovieEnds(video);
} }
void MohawkEngine_Myst::playFlybyMovie(const Common::String &name) { void MohawkEngine_Myst::playFlybyMovie(uint16 stack, uint16 card) {
Common::String filename = wrapMovieFilename(name, kMasterpieceOnly); // Play Flyby Entry Movie on Masterpiece Edition.
const char *flyby = nullptr;
switch (stack) {
case kSeleniticStack:
flyby = "selenitic flyby";
break;
case kStoneshipStack:
flyby = "stoneship flyby";
break;
// Myst Flyby Movie not used in Original Masterpiece Edition Engine
// We play it when first arriving on Myst, and if the user has chosen so.
case kMystStack:
if (ConfMan.getBool("playmystflyby"))
flyby = "myst flyby";
break;
case kMechanicalStack:
flyby = "mech age flyby";
break;
case kChannelwoodStack:
flyby = "channelwood flyby";
break;
default:
break;
}
if (!flyby) {
return;
}
Common::String filename = wrapMovieFilename(flyby, kMasterpieceOnly);
VideoEntryPtr video = _video->playMovie(filename, Audio::Mixer::kSFXSoundType); VideoEntryPtr video = _video->playMovie(filename, Audio::Mixer::kSFXSoundType);
if (!video) { if (!video) {
error("Failed to open the '%s' movie", filename.c_str()); error("Failed to open the '%s' movie", filename.c_str());
@ -486,20 +516,27 @@ void MohawkEngine_Myst::pauseEngineIntern(bool pause) {
void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) { void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) {
debug(2, "changeToStack(%d)", stack); debug(2, "changeToStack(%d)", stack);
_curStack = stack;
// Fill screen with black and empty cursor // Fill screen with black and empty cursor
_cursor->setCursor(0); _cursor->setCursor(0);
_currentCursor = 0; _currentCursor = 0;
_sound->stopEffect();
_video->stopVideos();
// In Myst ME, play a fullscreen flyby movie, except when loading saves.
// Also play a flyby when first linking to Myst.
if (getFeatures() & GF_ME
&& (_curStack != kIntroStack || (stack == kMystStack && card == 4134))) {
playFlybyMovie(stack, card);
}
_sound->stopBackground();
if (getFeatures() & GF_ME) if (getFeatures() & GF_ME)
_system->fillScreen(_system->getScreenFormat().RGBToColor(0, 0, 0)); _system->fillScreen(_system->getScreenFormat().RGBToColor(0, 0, 0));
else else
_gfx->clearScreenPalette(); _gfx->clearScreenPalette();
_sound->stopEffect();
_sound->stopBackground();
_video->stopVideos();
if (linkSrcSound) if (linkSrcSound)
playSoundBlocking(linkSrcSound); playSoundBlocking(linkSrcSound);
@ -509,6 +546,8 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
delete _prevStack; delete _prevStack;
_prevStack = _scriptParser; _prevStack = _scriptParser;
_curStack = stack;
switch (_curStack) { switch (_curStack) {
case kChannelwoodStack: case kChannelwoodStack:
_gameState->_globals.currentAge = 4; _gameState->_globals.currentAge = 4;
@ -576,38 +615,6 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_cache.clear(); _cache.clear();
_gfx->clearCache(); _gfx->clearCache();
if (getFeatures() & GF_ME) {
// Play Flyby Entry Movie on Masterpiece Edition.
const char *flyby = nullptr;
switch (_curStack) {
case kSeleniticStack:
flyby = "selenitic flyby";
break;
case kStoneshipStack:
flyby = "stoneship flyby";
break;
// Myst Flyby Movie not used in Original Masterpiece Edition Engine
// We play it when first arriving on Myst, and if the user has chosen so.
case kMystStack:
if (ConfMan.getBool("playmystflyby") && card == 4134)
flyby = "myst flyby";
break;
case kMechanicalStack:
flyby = "mech age flyby";
break;
case kChannelwoodStack:
flyby = "channelwood flyby";
break;
default:
break;
}
if (flyby) {
playFlybyMovie(flyby);
}
}
changeToCard(card, kTransitionCopy); changeToCard(card, kTransitionCopy);
if (linkDstSound) if (linkDstSound)

View File

@ -229,7 +229,7 @@ public:
VideoEntryPtr playMovie(const Common::String &name, MystStack stack); VideoEntryPtr playMovie(const Common::String &name, MystStack stack);
VideoEntryPtr findVideo(const Common::String &name, MystStack stack); VideoEntryPtr findVideo(const Common::String &name, MystStack stack);
void playMovieBlocking(const Common::String &name, MystStack stack, uint16 x, uint16 y); void playMovieBlocking(const Common::String &name, MystStack stack, uint16 x, uint16 y);
void playFlybyMovie(const Common::String &name); void playFlybyMovie(uint16 stack, uint16 card);
void waitUntilMovieEnds(const VideoEntryPtr &video); void waitUntilMovieEnds(const VideoEntryPtr &video);
void playSoundBlocking(uint16 id); void playSoundBlocking(uint16 id);