diff --git a/engines/cge2/cge2.cpp b/engines/cge2/cge2.cpp index 0da716e5696..1b364079fd7 100644 --- a/engines/cge2/cge2.cpp +++ b/engines/cge2/cge2.cpp @@ -25,7 +25,9 @@ * Copyright (c) 1994-1997 Janusz B. Wisniewski and L.K. Avalon */ +#include "engines/advancedDetector.h" #include "engines/util.h" +#include "common/text-to-speech.h" #include "common/config-manager.h" #include "common/debug.h" #include "common/debug-channels.h" @@ -181,6 +183,9 @@ bool CGE2Engine::hasFeature(EngineFeature f) const { } Common::Error CGE2Engine::run() { + Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager(); + if (ttsMan != nullptr) + ttsMan->setLanguage(Common::getLanguageCode(getLanguage())); syncSoundSettings(); initGraphics(kScrWidth, kScrHeight); @@ -195,4 +200,8 @@ Common::Error CGE2Engine::run() { return Common::kNoError; } +Common::Language CGE2Engine::getLanguage() const { + return _gameDescription->language; +} + } // End of namespace CGE2 diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h index 2dcc670fb75..af20bdcb3cc 100644 --- a/engines/cge2/cge2.h +++ b/engines/cge2/cge2.h @@ -157,6 +157,7 @@ public: bool hasFeature(EngineFeature f) const override; bool canSaveGameStateCurrently() override; bool canLoadGameStateCurrently() override; + Common::Language getLanguage() const; Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override; Common::Error loadGameState(int slot) override; Common::Error run() override; diff --git a/engines/cge2/detection.cpp b/engines/cge2/detection.cpp index f5c8c7cb79d..8146ae2d2d7 100644 --- a/engines/cge2/detection.cpp +++ b/engines/cge2/detection.cpp @@ -38,6 +38,8 @@ static const DebugChannelDef debugFlagList[] = { namespace CGE2 { #define GAMEOPTION_COLOR_BLIND_DEFAULT_OFF GUIO_GAMEOPTIONS1 +#define GAMEOPTION_TTS_OBJECTS GUIO_GAMEOPTIONS2 +#define GAMEOPTION_TTS_SPEECH GUIO_GAMEOPTIONS3 static const PlainGameDescriptor CGE2Games[] = { { "sfinx", "Sfinx" }, @@ -49,42 +51,42 @@ static const ADGameDescription gameDescriptions[] = { "sfinx", "Freeware", AD_ENTRY2s("vol.cat", "21197b287d397c53261b6616bf0dd880", 129024, "vol.dat", "de14291869a8eb7c2732ab783c7542ef", 34180844), - Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO2(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS) }, { "sfinx", "Freeware v1.0", AD_ENTRY2s("vol.cat", "aa402aed24a72c53a4d1211c456b79dd", 129024, "vol.dat", "5966ac26d91d664714349669f9dd09b5", 34180164), - Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO2(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS) }, { "sfinx", "Freeware v1.1", AD_ENTRY2s("vol.cat", "aa402aed24a72c53a4d1211c456b79dd", 129024, "vol.dat", "5966ac26d91d664714349669f9dd09b5", 34180367), - Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO2(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS) }, { "sfinx", "Freeware v0.3", AD_ENTRY2s("vol.cat", "f158e469dccbebc5a632eb848df89779", 129024, "vol.dat", "d40a6b4ae173d6930be54ba56bee15d5", 34183430), - Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO3(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS, GAMEOPTION_TTS_SPEECH) }, { "sfinx", "Freeware v1.0", AD_ENTRY2s("vol.cat", "f158e469dccbebc5a632eb848df89779", 129024, "vol.dat", "d40a6b4ae173d6930be54ba56bee15d5", 34183443), - Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO3(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS, GAMEOPTION_TTS_SPEECH) }, { "sfinx", "Freeware v1.1", AD_ENTRY2s("vol.cat", "f158e469dccbebc5a632eb848df89779", 129024, "vol.dat", "d40a6b4ae173d6930be54ba56bee15d5", 34182773), - Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF) + Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO3(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF, GAMEOPTION_TTS_OBJECTS, GAMEOPTION_TTS_SPEECH) }, AD_TABLE_END_MARKER @@ -101,6 +103,28 @@ static const ADExtraGuiOptionsMap optionsList[] = { } }, +#ifdef USE_TTS + { + GAMEOPTION_TTS_OBJECTS, + { + _s("Enable Text to Speech for Objects and Options"), + _s("Use TTS to read the descriptions (if TTS is available)"), + "tts_enabled_objects", + false + } + }, + + { + GAMEOPTION_TTS_SPEECH, + { + _s("Enable Text to Speech for Subtitles"), + _s("Use TTS to read the subtitles (if TTS is available)"), + "tts_enabled_speech", + false + } + }, +#endif + AD_EXTRA_GUI_OPTIONS_TERMINATOR }; diff --git a/engines/cge2/snail.cpp b/engines/cge2/snail.cpp index eb95b9cd521..e8e30ac6c90 100644 --- a/engines/cge2/snail.cpp +++ b/engines/cge2/snail.cpp @@ -31,6 +31,7 @@ #include "cge2/text.h" #include "cge2/sound.h" #include "cge2/events.h" +#include "common/config-manager.h" namespace CGE2 { @@ -656,7 +657,8 @@ void CGE2Engine::snSay(Sprite *spr, int val) { i -= 100; int16 oldRepeat = _sound->getRepeat(); _sound->setRepeat(1); - snSound(spr, i, Audio::Mixer::kSpeechSoundType); + if (!ConfMan.getBool("tts_enabled_speech") || getLanguage() == Common::PL_POL) + snSound(spr, i, Audio::Mixer::kSpeechSoundType); _sound->setRepeat(oldRepeat); _soundStat._wait = &_sound->_smpinf._counter; } diff --git a/engines/cge2/talk.cpp b/engines/cge2/talk.cpp index 8bd55220f80..9ea8e2c6787 100644 --- a/engines/cge2/talk.cpp +++ b/engines/cge2/talk.cpp @@ -28,6 +28,9 @@ #include "cge2/general.h" #include "cge2/talk.h" +#include "common/config-manager.h" +#include "common/text-to-speech.h" + namespace CGE2 { void CGE2Engine::setAutoColors() { @@ -111,6 +114,10 @@ uint16 Font::width(const char *text) { Talk::Talk(CGE2Engine *vm, const char *text, TextBoxStyle mode, ColorBank color, bool wideSpace) : Sprite(vm), _mode(mode), _created(false), _wideSpace(wideSpace), _vm(vm) { + Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager(); + if (ttsMan != nullptr && ConfMan.getBool("tts_enabled_speech")) + ttsMan->say(text); + _color = _vm->_font->_colorSet[color]; if (color == kCBRel) @@ -259,6 +266,10 @@ void InfoLine::update(const char *text) { _oldText = text; + Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager(); + if (text && ttsMan != nullptr && ConfMan.getBool("tts_enabled_objects")) + ttsMan->say(text); + uint16 w = _ext->_shpList->_w; uint16 h = _ext->_shpList->_h; uint8 *v = _ext->_shpList->_v; diff --git a/engines/cge2/vmenu.cpp b/engines/cge2/vmenu.cpp index 07b33a8c8fd..95a6bb913d9 100644 --- a/engines/cge2/vmenu.cpp +++ b/engines/cge2/vmenu.cpp @@ -25,6 +25,8 @@ * Copyright (c) 1994-1997 Janusz B. Wisniewski and L.K. Avalon */ +#include "common/config-manager.h" +#include "common/text-to-speech.h" #include "cge2/text.h" #include "cge2/vmenu.h" #include "cge2/events.h" @@ -83,7 +85,7 @@ MenuBar::MenuBar(CGE2Engine *vm, uint16 w, byte *c) : Talk(vm) { VMenu *VMenu::_addr = nullptr; VMenu::VMenu(CGE2Engine *vm, Common::Array list, V2D pos, ColorBank col) - : Talk(vm, vmGather(list), kTBRect, col), _menu(list), _bar(nullptr), _items(list.size()), _vm(vm) { + : Talk(vm, vmGather(list), kTBRect, col), _menu(list), _bar(nullptr), _items(list.size()), _vm(vm), _lastN(2) { delete[] _vmgt; // Lefotver of vmGather. _addr = this; @@ -151,6 +153,12 @@ void VMenu::touch(uint16 mask, V2D pos, Common::KeyCode keyCode) { _bar->gotoxyz(V2D(_vm, _pos2D.x, _pos2D.y + kTextVMargin + n * h - kMenuBarVerticalMargin)); n = _items - 1 - n; + Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager(); + if (_lastN != n) { + ttsMan->say(_menu[n]->_text, Common::TextToSpeechManager::INTERRUPT); + _lastN = n; + } + if (ok && (mask & kMouseLeftUp)) { _items = 0; _vm->_commandHandlerTurbo->addCommand(kCmdKill, -1, 0, this); diff --git a/engines/cge2/vmenu.h b/engines/cge2/vmenu.h index 883fcd2f1ad..cb9303952da 100644 --- a/engines/cge2/vmenu.h +++ b/engines/cge2/vmenu.h @@ -76,6 +76,7 @@ public: char *_vmgt; static VMenu *_addr; int _recent; + int _lastN; MenuBar *_bar; VMenu(CGE2Engine *vm, Common::Array list, V2D pos, ColorBank col);