aboutsummaryrefslogtreecommitdiff
path: root/sword2/driver/animation.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2005-04-25 05:23:21 +0000
committerTorbjörn Andersson2005-04-25 05:23:21 +0000
commit8776150321abb1d7d5f6ceb512713583e53d605e (patch)
tree5c95f937c2eace49b0190fa46ef0f4b03d3c4acb /sword2/driver/animation.cpp
parenteb3b057836ff5a88d10730ed6f9e059689364209 (diff)
downloadscummvm-rg350-8776150321abb1d7d5f6ceb512713583e53d605e.tar.gz
scummvm-rg350-8776150321abb1d7d5f6ceb512713583e53d605e.tar.bz2
scummvm-rg350-8776150321abb1d7d5f6ceb512713583e53d605e.zip
Better support for "seamless" cutscenes, i.e. ones where - in theory - you
shouldn't see where the cutscene begins/ends as it's the same image as is currently displayed by the game engine itself. Of course, in reality you can still see the seams easily. But at least it looks a bit beter now. I made most of this change yesterday, but it's less hard-wired now. svn-id: r17797
Diffstat (limited to 'sword2/driver/animation.cpp')
-rw-r--r--sword2/driver/animation.cpp102
1 files changed, 56 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);