CGE2: Adding TTS feature

This commit is contained in:
taylorzhancher 2021-07-26 19:35:27 +08:00 committed by GitHub
parent e4762aef5e
commit d3dd051e91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 64 additions and 8 deletions

View file

@ -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

View file

@ -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;

View file

@ -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
};

View file

@ -31,6 +31,7 @@
#include "cge2/text.h"
#include "cge2/sound.h"
#include "cge2/events.h"
#include "common/config-manager.h"
namespace CGE2 {
@ -656,6 +657,7 @@ void CGE2Engine::snSay(Sprite *spr, int val) {
i -= 100;
int16 oldRepeat = _sound->getRepeat();
_sound->setRepeat(1);
if (!ConfMan.getBool("tts_enabled_speech") || getLanguage() == Common::PL_POL)
snSound(spr, i, Audio::Mixer::kSpeechSoundType);
_sound->setRepeat(oldRepeat);
_soundStat._wait = &_sound->_smpinf._counter;

View file

@ -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;

View file

@ -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<Choice *> 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);

View file

@ -76,6 +76,7 @@ public:
char *_vmgt;
static VMenu *_addr;
int _recent;
int _lastN;
MenuBar *_bar;
VMenu(CGE2Engine *vm, Common::Array<Choice *> list, V2D pos, ColorBank col);