aboutsummaryrefslogtreecommitdiff
path: root/sword2/function.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2004-01-12 08:01:25 +0000
committerTorbjörn Andersson2004-01-12 08:01:25 +0000
commitc75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c (patch)
tree6bbf8d84a0305cd9bc1fdc193630852ad1fe076b /sword2/function.cpp
parente792b1c715af482e2907d8cdfa3c84f0e04cbd31 (diff)
downloadscummvm-rg350-c75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c.tar.gz
scummvm-rg350-c75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c.tar.bz2
scummvm-rg350-c75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c.zip
Sync the credits so that the text scroll and music will last for about the
same amount of time. I don't think the original did this, but it turned out to be pretty easy. svn-id: r12334
Diffstat (limited to 'sword2/function.cpp')
-rw-r--r--sword2/function.cpp48
1 files changed, 30 insertions, 18 deletions
diff --git a/sword2/function.cpp b/sword2/function.cpp
index ea4a89b584..701a57c9e4 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -585,8 +585,7 @@ int32 Logic::fnPlayCredits(int32 *params) {
// Start the music and roll the credits
// The credits music (which can also be heard briefly in the "carib"
- // cutscene) is played once, and there is no attempt at synchronizing
- // it with the credits scroll.
+ // cutscene) is played once.
int32 pars[2];
@@ -606,7 +605,18 @@ int32 Logic::fnPlayCredits(int32 *params) {
int startLine = 0;
int scrollPos = 0;
- while (scrollPos < lineTop + CREDITS_FONT_HEIGHT && !_vm->_quit) {
+ bool abortCredits = false;
+
+ int scrollSteps = lineTop + CREDITS_FONT_HEIGHT;
+ uint32 musicStart = _vm->_system->get_msecs();
+
+ // Ideally the music should last just a tiny bit longer than the
+ // credits. Note that musicTimeRemaining() will return 0 if the music
+ // is muted, so we need a sensible fallback for that case.
+
+ uint32 musicLength = MAX(1000 * (_vm->_sound->musicTimeRemaining() - 3), 25 * scrollSteps);
+
+ while (scrollPos < scrollSteps && !_vm->_quit) {
bool foundStartLine = false;
_vm->_graphics->clearScene();
@@ -671,13 +681,16 @@ int32 Logic::fnPlayCredits(int32 *params) {
KeyboardEvent ke;
if (_vm->_input->readKey(&ke) == RD_OK && ke.keycode == 27) {
- fnStopMusic(NULL);
- break;
+ if (!abortCredits) {
+ abortCredits = true;
+ _vm->_graphics->fadeDown();
+ }
}
-
- _vm->_system->delay_msecs(30);
+ if (abortCredits && _vm->_graphics->getFadeStatus() == RDFADE_BLACK)
+ break;
+ _vm->sleepUntil(musicStart + (musicLength * scrollPos) / scrollSteps);
scrollPos++;
}
@@ -694,20 +707,19 @@ int32 Logic::fnPlayCredits(int32 *params) {
if (logoData)
free(logoData);
- if (_vm->_quit)
- return IR_CONT;
+ if (!abortCredits) {
+ // The music should either have stopped or be about to stop, so
+ // wait for it to really happen.
- _vm->_graphics->fadeDown();
- _vm->_graphics->waitForFade();
-
- // The music should have stopped by now, but I suppose there is a
- // slim chance it hasn't on a really, really fast computer.
-
- while (_vm->_sound->musicTimeRemaining()) {
- _vm->_graphics->updateDisplay(false);
- _vm->_system->delay_msecs(100);
+ while (_vm->_sound->musicTimeRemaining() && !_vm->_quit) {
+ _vm->_graphics->updateDisplay(false);
+ _vm->_system->delay_msecs(100);
+ }
}
+ if (_vm->_quit)
+ return IR_CONT;
+
_vm->_sound->restoreMusicState();
_vm->_sound->muteFx(false);
_vm->_sound->muteSpeech(false);