diff options
| author | Torbjörn Andersson | 2004-01-12 08:01:25 +0000 | 
|---|---|---|
| committer | Torbjörn Andersson | 2004-01-12 08:01:25 +0000 | 
| commit | c75f5efd2f1b5fc6addcd67bc4865c2caeab8a6c (patch) | |
| tree | 6bbf8d84a0305cd9bc1fdc193630852ad1fe076b | |
| parent | e792b1c715af482e2907d8cdfa3c84f0e04cbd31 (diff) | |
| download | scummvm-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
| -rw-r--r-- | sword2/driver/d_sound.cpp | 10 | ||||
| -rw-r--r-- | sword2/function.cpp | 48 | 
2 files changed, 35 insertions, 23 deletions
| diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index dc1666d673..5a15aed16f 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -349,11 +349,6 @@ void Sound::saveMusicState(void) {  void Sound::restoreMusicState(void) {  	Common::StackLock lock(_mutex); -	int restoreStream; - -	if (!_music[2]._streaming) -		return; -  	// Fade out any music that happens to be playing  	for (int i = 0; i < MAXMUS; i++) { @@ -361,6 +356,11 @@ void Sound::restoreMusicState(void) {  			_music[i].fadeDown();  	} +	if (!_music[2]._streaming) +		return; + +	int restoreStream; +  	if (!_music[0]._streaming)  		restoreStream = 0;  	else 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); | 
