aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sword2/driver/animation.cpp102
-rw-r--r--sword2/driver/animation.h4
2 files changed, 60 insertions, 46 deletions
diff --git a/sword2/driver/animation.cpp b/sword2/driver/animation.cpp
index 2d75cf713e..ec1d2b56ff 100644
--- a/sword2/driver/animation.cpp
+++ b/sword2/driver/animation.cpp
@@ -109,25 +109,25 @@ void AnimationState::drawYUV(int width, int height, byte *const *dat) {
}
MovieInfo MoviePlayer::_movies[] = {
- { "carib", 222 },
- { "escape", 187 },
- { "eye", 248 },
- { "finale", 1485 },
- { "guard", 75 },
- { "intro", 1800 },
- { "jungle", 186 },
- { "museum", 167 },
- { "pablo", 75 },
- { "pyramid", 60 },
- { "quaram", 184 },
- { "river", 656 },
- { "sailing", 138 },
- { "shaman", 788 },
- { "stone1", 34 },
- { "stone2", 282 },
- { "stone3", 65 },
- { "demo", 60 },
- { "enddemo", 110 }
+ { "carib", 222, false },
+ { "escape", 187, false },
+ { "eye", 248, false },
+ { "finale", 1485, false },
+ { "guard", 75, false },
+ { "intro", 1800, false },
+ { "jungle", 186, false },
+ { "museum", 167, false },
+ { "pablo", 75, false },
+ { "pyramid", 60, false },
+ { "quaram", 184, false },
+ { "river", 656, false },
+ { "sailing", 138, false },
+ { "shaman", 788, true },
+ { "stone1", 34, false },
+ { "stone2", 282, false },
+ { "stone3", 65, false },
+ { "demo", 60, false },
+ { "enddemo", 110, false }
};
MoviePlayer::MoviePlayer(Sword2Engine *vm)
@@ -173,6 +173,11 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], int32 lea
if (_vm->_quit)
return RD_OK;
+ if (scumm_stricmp(filename, "shaman") == 0)
+ _seamless = true;
+ else
+ _seamless = false;
+
if (leadInRes) {
byte *leadIn = _vm->_resman->openResource(leadInRes);
uint32 leadInLen = _vm->_resman->fetchLen(leadInRes) - sizeof(StandardHeader);
@@ -198,6 +203,22 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], int32 lea
leadOut += sizeof(StandardHeader);
}
+ _leadOutFrame = (uint) -1;
+
+ int i;
+
+ for (i = 0; i < ARRAYSIZE(_movies); i++) {
+ if (scumm_stricmp(filename, _movies[i].name) == 0) {
+ _seamless = _movies[i].seamless;
+ if (_movies[i].frames > 60)
+ _leadOutFrame = _movies[i].frames - 60;
+ break;
+ }
+ }
+
+ if (i == ARRAYSIZE(_movies))
+ warning("Unknown movie, '%s'", filename);
+
#ifdef USE_MPEG2
playMPEG(filename, text, leadOut, leadOutLen);
#else
@@ -208,10 +229,10 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], int32 lea
_snd->stopHandle(leadInHandle);
// Wait for the lead-out to stop, if there is any. Though don't do it
- // for the "shaman" cutscene as it's obviously meant to blend into the
- // rest of the game, and the lead-out goes on for a long time.
+ // for seamless movies, since they are meant to blend into the rest of
+ // the game.
- if (scumm_stricmp(filename, "shaman") != 0) {
+ if (!_seamless) {
while (_vm->_mixer->isSoundHandleActive(_leadOutHandle)) {
_vm->_screen->updateDisplay();
_vm->_system->delayMillis(30);
@@ -257,22 +278,6 @@ void MoviePlayer::playMPEG(const char *filename, MovieTextObject *text[], byte *
flags |= SoundMixer::FLAG_LITTLE_ENDIAN;
#endif
- int i;
- uint leadOutFrame = (uint) -1;
-
- for (i = 0; i < ARRAYSIZE(_movies); i++) {
- if (scumm_stricmp(filename, _movies[i].name) == 0) {
- if (_movies[i].frames >= 60)
- leadOutFrame = _movies[i].frames - 60;
- else
- leadOutFrame = 0;
- break;
- }
- }
-
- if (i == ARRAYSIZE(_movies))
- warning("Unknown movie, '%s'", filename);
-
while (!skipCutscene && anim->decodeFrame()) {
// The frame has been drawn. Now draw the subtitles, if any,
// before updating the screen.
@@ -305,7 +310,7 @@ void MoviePlayer::playMPEG(const char *filename, MovieTextObject *text[], byte *
anim->updateScreen();
frameCounter++;
- if (frameCounter == leadOutFrame && leadOut)
+ if (frameCounter == _leadOutFrame && leadOut)
_vm->_sound->playFx(&_leadOutHandle, leadOut, leadOutLen, SoundMixer::kMaxChannelVolume, 0, false, SoundMixer::kMusicSoundType);
OSystem::Event event;
@@ -335,11 +340,14 @@ void MoviePlayer::playMPEG(const char *filename, MovieTextObject *text[], byte *
_sys->delayMillis(1000 / 12);
}
- // Most movies fade to black on their own, but not all of them. Since
- // we may be hanging around in the cutscene player for a while longer,
- // waiting for the lead-out sound to finish, paint the overlay black.
+ if (!_seamless) {
+ // Most movies fade to black on their own, but not all of them.
+ // Since we may be hanging around in the cutscene player for a
+ // while longer, waiting for the lead-out sound to finish,
+ // paint the overlay black.
- anim->clearScreen();
+ anim->clearScreen();
+ }
// If the speech is still playing, redraw the subtitles. At least in
// the English version this is most noticeable in the "carib" cutscene.
@@ -364,9 +372,11 @@ void MoviePlayer::playMPEG(const char *filename, MovieTextObject *text[], byte *
_sys->delayMillis(100);
}
- // Clear the screen again
- anim->clearScreen();
- anim->updateScreen();
+ if (!_seamless) {
+ // Clear the screen again
+ anim->clearScreen();
+ anim->updateScreen();
+ }
_vm->_screen->setPalette(0, 256, oldPal, RDPAL_INSTANT);
diff --git a/sword2/driver/animation.h b/sword2/driver/animation.h
index c9d75da66e..3d6c3fc385 100644
--- a/sword2/driver/animation.h
+++ b/sword2/driver/animation.h
@@ -67,6 +67,7 @@ private:
struct MovieInfo {
char name[9];
uint frames;
+ bool seamless;
};
class MoviePlayer {
@@ -79,6 +80,9 @@ private:
SoundHandle _leadOutHandle;
+ uint _leadOutFrame;
+ bool _seamless;
+
static struct MovieInfo _movies[];
void openTextObject(MovieTextObject *obj);