From c75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 12 Jan 2004 08:01:25 +0000 Subject: 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 --- sword2/function.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) (limited to 'sword2/function.cpp') 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); -- cgit v1.2.3