diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/kyra/kyra.h | 3 | ||||
-rw-r--r-- | engines/kyra/kyra_v1.h | 6 | ||||
-rw-r--r-- | engines/kyra/kyra_v2.cpp | 58 | ||||
-rw-r--r-- | engines/kyra/kyra_v2.h | 20 | ||||
-rw-r--r-- | engines/kyra/scene_v2.cpp | 11 | ||||
-rw-r--r-- | engines/kyra/script_v2.cpp | 41 | ||||
-rw-r--r-- | engines/kyra/sound.cpp | 10 | ||||
-rw-r--r-- | engines/kyra/sound_v1.cpp | 10 | ||||
-rw-r--r-- | engines/kyra/text_v2.cpp | 27 |
9 files changed, 146 insertions, 40 deletions
diff --git a/engines/kyra/kyra.h b/engines/kyra/kyra.h index 95e48474ac..5bfb1696a8 100644 --- a/engines/kyra/kyra.h +++ b/engines/kyra/kyra.h @@ -117,6 +117,9 @@ public: virtual void snd_playTheme(int file, int track = 0); virtual void snd_playSoundEffect(int id); virtual void snd_playWanderScoreViaMap(int command, int restart); + virtual void snd_playVoiceFile(int id) = 0; + virtual bool snd_voiceIsPlaying(); + virtual void snd_stopVoice(); // delay functionallity virtual void delayUntil(uint32 timestamp, bool updateGameTimers = false, bool update = false, bool isMainLoop = false); diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index a7371ac510..734d81505e 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -275,12 +275,10 @@ public: void readSettings(); void writeSettings(); - void snd_playVoiceFile(int id); - void snd_voiceWaitForFinish(bool ingame = true); - bool snd_voiceIsPlaying(); - void snd_stopVoice(); void snd_playSoundEffect(int track); void snd_playWanderScoreViaMap(int command, int restart); + virtual void snd_playVoiceFile(int id); + void snd_voiceWaitForFinish(bool ingame = true); bool speechEnabled(); bool textEnabled(); diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index c25836c1e7..a079a83737 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -57,6 +57,8 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags) : KyraEngi _noScriptEnter = true; _currentChapter = 0; _newChapterFile = 1; + _oldTalkFile = -1; + _currentTalkFile = 0; _handItemSet = -1; _lastProcessedSceneScript = 0; _specialSceneScriptRunFlag = false; @@ -67,6 +69,9 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags) : KyraEngi _newShapeCount = 0; _newShapeFiledata = 0; + _vocHigh = -1; + _chatVocHigh = -1; + _chatVocLow = -1; _chatText = 0; _chatObject = -1; @@ -218,11 +223,11 @@ void KyraEngine_v2::startup() { showMessageFromCCode(265, 150, 0); - // XXX - - showMessageFromCCode(0, 0, 207); + openTalkFile(0); + _currentTalkFile = 1; + openTalkFile(1); - // XXX + showMessage(0, 207); _screen->setShapePages(5, 3); @@ -1393,6 +1398,34 @@ void KyraEngine_v2::restoreGfxRect24x24(int x, int y) { #pragma mark - +void KyraEngine_v2::openTalkFile(int newFile) { + char talkFilename[16]; + + if (_oldTalkFile > 0) { + sprintf(talkFilename, "CH%dVOC.TLK", _oldTalkFile); + _res->unloadPakFile(talkFilename); + _oldTalkFile = -1; + } + + if (newFile == 0) { + strcpy(talkFilename, "ANYTALK.TLK"); + _res->loadPakFile(talkFilename); + } else { + sprintf(talkFilename, "CH%dVOC.TLK", newFile); + _res->loadPakFile(talkFilename); + } + + _oldTalkFile = newFile; +} + +void KyraEngine_v2::snd_playVoiceFile(int id) { + debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::snd_playVoiceFile(%d)", id); + char vocFile[9]; + assert(id >= 0 && id <= 9999999); + sprintf(vocFile, "%07d", id); + _sound->voicePlay(vocFile); +} + void KyraEngine_v2::snd_loadSoundFile(int id) { if (id < 0 || !_trackMap) return; @@ -1403,6 +1436,11 @@ void KyraEngine_v2::snd_loadSoundFile(int id) { _sound->loadSoundFile(file); } +void KyraEngine_v2::playVoice(int high, int low) { + int vocFile = high * 10000 + low * 10; + snd_playVoiceFile(vocFile); +} + #pragma mark - typedef Functor1Mem<ScriptState*, int, KyraEngine_v2> OpcodeV2; @@ -1619,15 +1657,15 @@ void KyraEngine_v2::setupOpcodeTable() { OpcodeUnImpl(), OpcodeUnImpl(), OpcodeUnImpl(), - OpcodeUnImpl(), + Opcode(o2_setVocHigh), // 0xa8 - OpcodeUnImpl(), + Opcode(o2_getVocHigh), Opcode(o2_zanthiaChat), - OpcodeUnImpl(), - OpcodeUnImpl(), + Opcode(o2_isVoiceEnabled), + Opcode(o2_isVoicePlaying), // 0xac - OpcodeUnImpl(), - OpcodeUnImpl(), + Opcode(o2_stopVoicePlaying), + Opcode(o2_getGameLanguage), Opcode(o2_dummy), Opcode(o2_dummy), }; diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index aebc8980e7..c0cdcb0c32 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -501,10 +501,13 @@ protected: int _msgUnk1; // chat + int _vocHigh; + const char *_chatText; int _chatObject; bool _chatIsNote; uint32 _chatEndTime; + int _chatVocHigh, _chatVocLow; ScriptData _chatScriptData; ScriptState _chatScriptState; @@ -512,14 +515,21 @@ protected: int chatGetType(const char *text); int chatCalcDuration(const char *text); - void objectChat(const char *text, int object, int unk1, int unk2); - void objectChatInit(const char *text, int object, int unk1, int unk2); + void objectChat(const char *text, int object, int vocHigh, int vocLow); + void objectChatInit(const char *text, int object, int vocHigh, int vocLow); void objectChatPrintText(const char *text, int object); void objectChatProcess(const char *script); void objectChatWaitToFinish(); // sound + int _oldTalkFile; + int _currentTalkFile; + void openTalkFile(int newFile); + + virtual void snd_playVoiceFile(int id); void snd_loadSoundFile(int id); + + void playVoice(int high, int low); // timer void timerFunc2(int); @@ -584,7 +594,13 @@ protected: int o2_querySpecialSceneScriptState(ScriptState *script); int o2_customChat(ScriptState *script); int o2_customChatFinish(ScriptState *script); + int o2_setVocHigh(ScriptState *script); + int o2_getVocHigh(ScriptState *script); int o2_zanthiaChat(ScriptState *script); + int o2_isVoiceEnabled(ScriptState *script); + int o2_isVoicePlaying(ScriptState *script); + int o2_stopVoicePlaying(ScriptState *script); + int o2_getGameLanguage(ScriptState *script); int o2_dummy(ScriptState *script); // opcodes temporary diff --git a/engines/kyra/scene_v2.cpp b/engines/kyra/scene_v2.cpp index 56f9bdc831..cb6326ce8b 100644 --- a/engines/kyra/scene_v2.cpp +++ b/engines/kyra/scene_v2.cpp @@ -33,7 +33,15 @@ namespace Kyra { void KyraEngine_v2::enterNewScene(uint16 newScene, int facing, int unk1, int unk2, int unk3) { - // XXX + if (_newChapterFile != _currentTalkFile) { + _currentTalkFile = _newChapterFile; + showMessageFromCCode(265, 150, 0); + _screen->updateScreen(); + openTalkFile(_currentTalkFile); + showMessage(0, 207); + _screen->updateScreen(); + } + _screen->hideMouse(); if (!unk3) { @@ -897,7 +905,6 @@ void KyraEngine_v2::fadeScenePal(int srcIndex, int delayTime) { const uint8 *src = _scenePal + (srcIndex << 4)*3; memcpy(dst, src, 48); - // TODO: original passes delay function too _screen->fadePalette(_screen->getPalette(0), delayTime, &_updateFunctor); } diff --git a/engines/kyra/script_v2.cpp b/engines/kyra/script_v2.cpp index a91a296f7c..5b45be410b 100644 --- a/engines/kyra/script_v2.cpp +++ b/engines/kyra/script_v2.cpp @@ -601,9 +601,10 @@ int KyraEngine_v2::o2_customChat(ScriptState *script) { strcpy((char*)_unkBuf500Bytes, stackPosString(0)); _chatText = (char*)_unkBuf500Bytes; _chatObject = stackPos(1); - //XXX - objectChatInit(_chatText, _chatObject, 0/*_unk11*/, stackPos(2)); - //XXX + + _chatVocHigh = _chatVocLow = -1; + objectChatInit(_chatText, _chatObject, _vocHigh, stackPos(2)); + playVoice(_vocHigh, stackPos(2)); return 0; } @@ -615,12 +616,44 @@ int KyraEngine_v2::o2_customChatFinish(ScriptState *script) { return 0; } +int KyraEngine_v2::o2_setVocHigh(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_setVocHigh(%p) (%d)", (const void *)script, stackPos(0)); + _vocHigh = stackPos(0); + return _vocHigh; +} + +int KyraEngine_v2::o2_getVocHigh(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_getVocHigh(%p) ()", (const void *)script); + return _vocHigh; +} + int KyraEngine_v2::o2_zanthiaChat(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "o2_zanthiaChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1)); - objectChat(stackPosString(0), 0, /*_unk11*/0, stackPos(1)); + objectChat(stackPosString(0), 0, _vocHigh, stackPos(1)); + return 0; +} + +int KyraEngine_v2::o2_isVoiceEnabled(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_isVoiceEnabled(%p) ()", (const void *)script); + return 1/*voiceEnabled()*/; +} + +int KyraEngine_v2::o2_isVoicePlaying(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_isVoicePlaying(%p) ()", (const void *)script); + return snd_voiceIsPlaying() ? 1 : 0; +} + +int KyraEngine_v2::o2_stopVoicePlaying(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_stopVoicePlaying(%p) ()", (const void *)script); + snd_stopVoice(); return 0; } +int KyraEngine_v2::o2_getGameLanguage(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "o2_getGameLanguage(%p) ()", (const void *)script); + return _lang; +} + int KyraEngine_v2::o2_dummy(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "o2_dummy(%p) ()", (const void *)script); return 0; diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp index d9a3517519..2978475f0e 100644 --- a/engines/kyra/sound.cpp +++ b/engines/kyra/sound.cpp @@ -478,6 +478,16 @@ void KyraEngine::snd_playWanderScoreViaMap(int command, int restart) { _lastMusicCommand = command; } +void KyraEngine::snd_stopVoice() { + debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine::snd_stopVoice()"); + _sound->voiceStop(); +} + +bool KyraEngine::snd_voiceIsPlaying() { + debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine::snd_voiceIsPlaying()"); + return _sound->voiceIsPlaying(); +} + // static res const Sound::SpeechCodecs Sound::_supportedCodes[] = { diff --git a/engines/kyra/sound_v1.cpp b/engines/kyra/sound_v1.cpp index 3ac28701e1..9675eb2d33 100644 --- a/engines/kyra/sound_v1.cpp +++ b/engines/kyra/sound_v1.cpp @@ -87,14 +87,4 @@ void KyraEngine_v1::snd_voiceWaitForFinish(bool ingame) { } } -void KyraEngine_v1::snd_stopVoice() { - debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v1::snd_stopVoice()"); - _sound->voiceStop(); -} - -bool KyraEngine_v1::snd_voiceIsPlaying() { - debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v1::snd_voiceIsPlaying()"); - return _sound->voiceIsPlaying(); -} - } // end of namespace Kyra diff --git a/engines/kyra/text_v2.cpp b/engines/kyra/text_v2.cpp index 4bd27c14bc..bb8b65c476 100644 --- a/engines/kyra/text_v2.cpp +++ b/engines/kyra/text_v2.cpp @@ -126,12 +126,12 @@ int KyraEngine_v2::chatCalcDuration(const char *str) { return MIN<int>(strlen(str) << 3, 120); } -void KyraEngine_v2::objectChat(const char *str, int object, int unk1, int unk2) { +void KyraEngine_v2::objectChat(const char *str, int object, int vocHigh, int vocLow) { //setNextIdleAnimTimer(); - //XXX + _chatVocHigh = _chatVocLow = -1; - objectChatInit(str, object, unk1, unk2); + objectChatInit(str, object, vocHigh, vocLow); _chatText = str; _chatObject = object; _chatIsNote = (chatGetType(str) == -1); @@ -179,7 +179,7 @@ void KyraEngine_v2::objectChat(const char *str, int object, int unk1, int unk2) //setNextIdelAnimTimer(); } -void KyraEngine_v2::objectChatInit(const char *str, int object, int unk1, int unk2) { +void KyraEngine_v2::objectChatInit(const char *str, int object, int vocHigh, int vocLow) { str = _text->preprocessString(str); int lineNum = _text->buildMessageSubstrings(str); @@ -216,7 +216,12 @@ void KyraEngine_v2::objectChatInit(const char *str, int object, int unk1, int un _chatEndTime = _system->getMillis(); } - //XXX + if (1/*voiceEnabled()*/) { + _chatVocHigh = vocHigh; + _chatVocLow = vocLow; + } else { + _chatVocHigh = _chatVocLow = -1; + } _screen->showMouse(); } @@ -254,8 +259,14 @@ void KyraEngine_v2::objectChatProcess(const char *script) { uint8 *shapeBuffer = _res->fileData(_newShapeFilename, 0); if (shapeBuffer) { int shapeCount = initNewShapes(shapeBuffer); - //XXX + + if (_chatVocHigh >= 0) { + playVoice(_chatVocHigh, _chatVocLow); + _chatVocHigh = _chatVocLow = -1; + } + objectChatWaitToFinish(); + resetNewShapes(shapeCount, shapeBuffer); } else { warning("couldn't load file '%s'", _newShapeFilename); @@ -300,11 +311,11 @@ void KyraEngine_v2::objectChatWaitToFinish() { if (inputFlag == 198 || inputFlag == 199) { //XXX _skipFlag = true; + snd_stopVoice(); } const uint32 curTime = _system->getMillis(); - //XXX - if (curTime > endTime || _skipFlag) { + if ((1/*textEnabled()*/ && curTime > endTime) || (1/*voiceEnabled()*/ && !snd_voiceIsPlaying()) || _skipFlag) { _skipFlag = false; nextFrame = curTime; running = false; |