Skip to content

Commit

Permalink
MOHAWK: MYST: Fix flyby movies to behave more like the original
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
bgK committed Apr 10, 2018
1 parent 58d4f11 commit 3a8655b
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 40 deletions.
85 changes: 46 additions & 39 deletions engines/mohawk/myst.cpp
Expand Up @@ -262,8 +262,38 @@ void MohawkEngine_Myst::playMovieBlocking(const Common::String &name, MystStack
waitUntilMovieEnds(video);
}

void MohawkEngine_Myst::playFlybyMovie(const Common::String &name) {
Common::String filename = wrapMovieFilename(name, kMasterpieceOnly);
void MohawkEngine_Myst::playFlybyMovie(uint16 stack, uint16 card) {
// 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);
if (!video) {
error("Failed to open the '%s' movie", filename.c_str());
Expand Down Expand Up @@ -486,20 +516,27 @@ void MohawkEngine_Myst::pauseEngineIntern(bool pause) {
void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) {
debug(2, "changeToStack(%d)", stack);

_curStack = stack;

// Fill screen with black and empty cursor
_cursor->setCursor(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)
_system->fillScreen(_system->getScreenFormat().RGBToColor(0, 0, 0));
else
_gfx->clearScreenPalette();

_sound->stopEffect();
_sound->stopBackground();
_video->stopVideos();
if (linkSrcSound)
playSoundBlocking(linkSrcSound);

Expand All @@ -509,6 +546,8 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
delete _prevStack;
_prevStack = _scriptParser;

_curStack = stack;

switch (_curStack) {
case kChannelwoodStack:
_gameState->_globals.currentAge = 4;
Expand Down Expand Up @@ -576,38 +615,6 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_cache.clear();
_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);

if (linkDstSound)
Expand Down
2 changes: 1 addition & 1 deletion engines/mohawk/myst.h
Expand Up @@ -229,7 +229,7 @@ class MohawkEngine_Myst : public MohawkEngine {
VideoEntryPtr playMovie(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 playFlybyMovie(const Common::String &name);
void playFlybyMovie(uint16 stack, uint16 card);
void waitUntilMovieEnds(const VideoEntryPtr &video);

void playSoundBlocking(uint16 id);
Expand Down

0 comments on commit 3a8655b

Please sign in to comment.