aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2006-01-12 14:53:23 +0000
committerJohannes Schickel2006-01-12 14:53:23 +0000
commitf0544b2e6bfbb8cf51c44215e8dafd377d7cfa05 (patch)
treea7456fdbf6015f919b44a10916e8c261814d49bd
parent2416254e494d93b52009548f940f7ca28bc4db6d (diff)
downloadscummvm-rg350-f0544b2e6bfbb8cf51c44215e8dafd377d7cfa05.tar.gz
scummvm-rg350-f0544b2e6bfbb8cf51c44215e8dafd377d7cfa05.tar.bz2
scummvm-rg350-f0544b2e6bfbb8cf51c44215e8dafd377d7cfa05.zip
Fixed sound while loading games and fixed bug # 1403370.
svn-id: r19989
-rw-r--r--kyra/kyra.cpp33
-rw-r--r--kyra/kyra.h5
-rw-r--r--kyra/saveload.cpp9
3 files changed, 32 insertions, 15 deletions
diff --git a/kyra/kyra.cpp b/kyra/kyra.cpp
index bb0c8d588d..47e6472f8f 100644
--- a/kyra/kyra.cpp
+++ b/kyra/kyra.cpp
@@ -415,6 +415,8 @@ int KyraEngine::init(GameDetector &detector) {
_mousePressFlag = false;
_targetName = detector._targetName;
+
+ _lastMusicCommand = 0;
return 0;
}
@@ -581,7 +583,7 @@ void KyraEngine::startup() {
enterNewScene(_currentCharacter->sceneId, _currentCharacter->facing, 0, 0, 1);
}
-void KyraEngine::delay(uint32 amount, bool update) {
+void KyraEngine::delay(uint32 amount, bool update, bool isMainLoop) {
OSystem::Event event;
char saveLoadSlot[20];
@@ -596,13 +598,13 @@ void KyraEngine::delay(uint32 amount, bool update) {
} else if (event.kbd.keycode == 'd' && !_debugger->isAttached()) {
_debugger->attach();
} else if (event.kbd.keycode >= '0' && event.kbd.keycode <= '9' &&
- (event.kbd.flags == OSystem::KBD_CTRL || event.kbd.flags == OSystem::KBD_ALT)) {
+ (event.kbd.flags == OSystem::KBD_CTRL || event.kbd.flags == OSystem::KBD_ALT) && isMainLoop) {
sprintf(saveLoadSlot, "%s.00%d", _targetName.c_str(), event.kbd.keycode - '0');
if (event.kbd.flags == OSystem::KBD_CTRL)
loadGame(saveLoadSlot);
else
saveGame(saveLoadSlot, saveLoadSlot);
- } else if (event.kbd.flags == OSystem::KBD_CTRL && event.kbd.keycode == 'f') {
+ } else if (event.kbd.flags == OSystem::KBD_CTRL && event.kbd.keycode == 'f') {
_fastMode = !_fastMode;
}
break;
@@ -720,7 +722,7 @@ void KyraEngine::mainLoop() {
updateTextFade();
_handleInput = true;
- delay((frameTime + _gameSpeed) - _system->getMillis(), true);
+ delay((frameTime + _gameSpeed) - _system->getMillis(), true, true);
_handleInput = false;
}
}
@@ -1722,8 +1724,8 @@ void KyraEngine::snd_playSoundEffect(int track) {
}
}
-void KyraEngine::snd_playWanderScoreViaMap(int unk1, int unk2) {
- debug(9, "KyraEngine::snd_playWanderScoreViaMap(%d, %d)", unk1, unk2);
+void KyraEngine::snd_playWanderScoreViaMap(int command, int restart) {
+ debug(9, "KyraEngine::snd_playWanderScoreViaMap(%d, %d)", command, restart);
const static int8 soundTable[] = {
-1, 0, -1, 1, 0, 3, 0, 2,
0, 4, 1, 2, 1, 3, 1, 4,
@@ -1743,16 +1745,23 @@ void KyraEngine::snd_playWanderScoreViaMap(int unk1, int unk2) {
//if (!_disableSound) {
// XXX
//}
- assert(unk1*2+1 < ARRAYSIZE(soundTable));
- if (_curMusicTheme != soundTable[unk1*2]+1) {
- if (soundTable[unk1*2] != -1) {
- snd_playTheme(soundTable[unk1*2]+1);
+ assert(command*2+1 < ARRAYSIZE(soundTable));
+ if (_curMusicTheme != soundTable[command*2]+1) {
+ if (soundTable[command*2] != -1) {
+ snd_playTheme(soundTable[command*2]+1);
}
}
- if (unk1 != 1) {
- snd_playTrack(soundTable[unk1*2+1], true);
+ if (restart)
+ _lastMusicCommand = -1;
+
+ if (command != 1) {
+ if (_lastMusicCommand != command) {
+ _lastMusicCommand = command;
+ snd_playTrack(soundTable[command*2+1], true);
+ }
} else {
+ _lastMusicCommand = 1;
_midi->beginFadeOut();
while (_midi->fadeOut()) {
_system->delayMillis(10);
diff --git a/kyra/kyra.h b/kyra/kyra.h
index ff560df674..bf1821d741 100644
--- a/kyra/kyra.h
+++ b/kyra/kyra.h
@@ -219,7 +219,7 @@ public:
void snd_playVoiceFile(int id);
bool snd_voicePlaying();
void snd_playSoundEffect(int track);
- void snd_playWanderScoreViaMap(int unk1, int unk2);
+ void snd_playWanderScoreViaMap(int command, int restart);
void drawSentenceCommand(char *sentence, int unk1);
void updateSentenceCommand(char *str1, char *str2, int unk1);
@@ -559,7 +559,7 @@ protected:
void res_freeLangTable(char ***sting, int *size);
void waitForEvent();
- void delay(uint32 millis, bool update = false);
+ void delay(uint32 millis, bool update = false, bool mainLoop = false);
void loadPalette(const char *filename, uint8 *palData);
void loadMouseShapes();
void loadCharacterShapes();
@@ -712,6 +712,7 @@ protected:
int _curMusicTheme;
int _newMusicTheme;
+ int16 _lastMusicCommand;
AudioStream *_currentVocFile;
Audio::SoundHandle _vocHandle;
diff --git a/kyra/saveload.cpp b/kyra/saveload.cpp
index a46f3d302c..a396658660 100644
--- a/kyra/saveload.cpp
+++ b/kyra/saveload.cpp
@@ -27,7 +27,7 @@
#include "common/savefile.h"
#include "common/system.h"
-#define CURRENT_VERSION 2
+#define CURRENT_VERSION 3
namespace Kyra {
void KyraEngine::loadGame(const char *fileName) {
@@ -167,6 +167,11 @@ void KyraEngine::loadGame(const char *fileName) {
_roomTable[sceneId].needInit[i] = in->readByte();
}
}
+ if (version >= 3) {
+ _lastMusicCommand = in->readSint16BE();
+ if (_lastMusicCommand != -1)
+ snd_playWanderScoreViaMap(_lastMusicCommand, 1);
+ }
if (queryGameFlag(0x2D)) {
loadMainScreen(8);
@@ -297,6 +302,8 @@ void KyraEngine::saveGame(const char *fileName, const char *saveName) {
}
// room table terminator
out->writeUint16BE(0xFFFF);
+
+ out->writeSint16BE(_lastMusicCommand);
out->flush();