diff options
-rw-r--r-- | kyra/kyra.cpp | 30 | ||||
-rw-r--r-- | kyra/script_v1.cpp | 16 | ||||
-rw-r--r-- | kyra/staticres.cpp | 2 |
3 files changed, 40 insertions, 8 deletions
diff --git a/kyra/kyra.cpp b/kyra/kyra.cpp index 66348df80d..2110dcf7f0 100644 --- a/kyra/kyra.cpp +++ b/kyra/kyra.cpp @@ -344,6 +344,8 @@ int KyraEngine::init(GameDetector &detector) { _marbleVaseItem = -1; _mouseState = _itemInHand = -1; _handleInput = false; + + _currentRoom = 0xFFFF; return 0; } @@ -1186,18 +1188,36 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int assert(sceneId < _roomTableSize); Room *currentRoom = &_roomTable[sceneId]; - + + if (_currentRoom != 0xFFFF && (_features & GF_TALKIE)) { + char file[32]; + assert(_currentRoom < _roomTableSize); + int tableId = _roomTable[_currentRoom].nameIndex; + assert(tableId < _roomFilenameTableSize); + strcpy(file, _roomFilenameTable[tableId]); + strcat(file, ".VRM"); + _res->unloadPakFile(file); + } + + _currentRoom = sceneId; + assert(_currentCharacter->sceneId < _roomTableSize); int tableId = _roomTable[_currentCharacter->sceneId].nameIndex; assert(tableId < _roomFilenameTableSize); - char datFileNameBuffer[32]; - strcpy(datFileNameBuffer, _roomFilenameTable[tableId]); - strcat(datFileNameBuffer, ".DAT"); - _sprites->loadDAT(datFileNameBuffer, _sceneExits); + char fileNameBuffer[32]; + strcpy(fileNameBuffer, _roomFilenameTable[tableId]); + strcat(fileNameBuffer, ".DAT"); + _sprites->loadDAT(fileNameBuffer, _sceneExits); _sprites->setupSceneAnims(); _scriptInterpreter->unloadScript(_scriptClickData); loadSceneMSC(); + if ((_features & GF_TALKIE)) { + strcpy(fileNameBuffer, _roomFilenameTable[tableId]); + strcat(fileNameBuffer, ".VRM"); + _res->loadPakFile(fileNameBuffer); + } + _walkBlockNorth = currentRoom->northExit; _walkBlockEast = currentRoom->eastExit; _walkBlockSouth = currentRoom->southExit; diff --git a/kyra/script_v1.cpp b/kyra/script_v1.cpp index 5b26cc5e1e..7d82bc3687 100644 --- a/kyra/script_v1.cpp +++ b/kyra/script_v1.cpp @@ -314,6 +314,12 @@ int KyraEngine::cmd_characterSays(ScriptState *script) { if (_features & GF_TALKIE) { debug(3, "cmd_characterSays(0x%X) (%d, '%s', %d, %d)", script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3)); + while (snd_voicePlaying()) { + _sprites->updateSceneAnims(); + updateAllObjectShapes(); + _system->delayMillis(10); + } + snd_playVoiceFile(stackPos(0)); characterSays(stackPosString(1), stackPos(2), stackPos(3)); } else { debug(3, "cmd_characterSays(0x%X) ('%s', %d, %d)", script, stackPosString(0), stackPos(1), stackPos(2)); @@ -773,6 +779,12 @@ int KyraEngine::cmd_loadPageFromDisk(ScriptState *script) { int KyraEngine::cmd_customPrintTalkString(ScriptState *script) { if (_features & GF_TALKIE) { debug(3, "cmd_customPrintTalkString(0x%X) ('%s', %d, %d, %d)", script, stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF); + while (snd_voicePlaying()) { + _sprites->updateSceneAnims(); + updateAllObjectShapes(); + _system->delayMillis(10); + } + snd_playVoiceFile(stackPos(0)); printTalkTextMessage(stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF, 0, 2); } else { debug(3, "cmd_customPrintTalkString(0x%X) ('%s', %d, %d, %d)", script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF); @@ -1428,10 +1440,10 @@ int KyraEngine::cmd_setScaleDepthTableValue(ScriptState *script) { int KyraEngine::cmd_message(ScriptState *script) { if (_features & GF_TALKIE) { - debug(9, "cmd_message(0x%X)", script); + debug(3, "cmd_message(0x%X) (%d, '%s', %d)", script, stackPos(0), stackPosString(1), stackPos(2)); drawSentenceCommand(stackPosString(1), stackPos(2)); } else { - debug(9, "cmd_message(0x%X)", script); + debug(3, "cmd_message(0x%X) ('%s', %d)", script, stackPosString(0), stackPos(1)); drawSentenceCommand(stackPosString(0), stackPos(1)); } diff --git a/kyra/staticres.cpp b/kyra/staticres.cpp index 8c7e17faf9..f29b0e4ba1 100644 --- a/kyra/staticres.cpp +++ b/kyra/staticres.cpp @@ -26,7 +26,7 @@ namespace Kyra { -#define RESFILE_VERSION 2 +#define RESFILE_VERSION 3 #define GAME_FLAGS (GF_FLOPPY | GF_TALKIE | GF_DEMO | GF_AUDIOCD) #define LANGUAGE_FLAGS (GF_ENGLISH | GF_FRENCH | GF_GERMAN | GF_SPANISH | GF_LNGUNK) |