[Scummvm-git-logs] scummvm master -> 3b6d25da1468b188498f695ce5b73529701917a9

sev- noreply at scummvm.org
Thu Aug 21 08:28:15 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
3b6d25da14 SCUMM: Add text-to-speech (TTS)


Commit: 3b6d25da1468b188498f695ce5b73529701917a9
    https://github.com/scummvm/scummvm/commit/3b6d25da1468b188498f695ce5b73529701917a9
Author: ellm135 (ellm13531 at gmail.com)
Date: 2025-08-21T10:28:12+02:00

Commit Message:
SCUMM: Add text-to-speech (TTS)

Changed paths:
    engines/scumm/actor.cpp
    engines/scumm/charset-fontdata.cpp
    engines/scumm/charset.h
    engines/scumm/detection.h
    engines/scumm/detection_tables.h
    engines/scumm/dialogs.cpp
    engines/scumm/dialogs.h
    engines/scumm/gfx_gui.cpp
    engines/scumm/input.cpp
    engines/scumm/metaengine.cpp
    engines/scumm/room.cpp
    engines/scumm/script.cpp
    engines/scumm/script_v0.cpp
    engines/scumm/script_v2.cpp
    engines/scumm/script_v5.cpp
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/scumm_v7.h
    engines/scumm/sound.cpp
    engines/scumm/string.cpp
    engines/scumm/string_v7.cpp
    engines/scumm/verbs.cpp


diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 1770e4a0bc5..7c48e4923aa 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -3532,6 +3532,9 @@ void ScummEngine::actorTalk(const byte *msg) {
 	if (VAR_CHARCOUNT != 0xFF)
 		VAR(VAR_CHARCOUNT) = 0;
 	_haveActorSpeechMsg = true;
+#ifdef USE_TTS
+	stopTextToSpeech();
+#endif
 	displayDialog();
 }
 
@@ -3589,6 +3592,9 @@ void ScummEngine::stopTalk() {
 		setTalkingActor(0);
 	}
 
+#ifdef USE_TTS
+	stopTextToSpeech();
+#endif
 	_keepText = false;
 	if (_game.version >= 7) {
 #ifdef ENABLE_SCUMM_7_8
diff --git a/engines/scumm/charset-fontdata.cpp b/engines/scumm/charset-fontdata.cpp
index f9c84c90654..7633ef58b63 100644
--- a/engines/scumm/charset-fontdata.cpp
+++ b/engines/scumm/charset-fontdata.cpp
@@ -654,6 +654,17 @@ static const byte specialCharsetData[] = {
 	0x10, 0x08, 0x00, 0x3c, 0x66, 0x66, 0x3c, 0x00,
 };
 
+#ifdef USE_TTS
+
+static const uint16 specialCharactersEncoding[] = {
+	0x0024, 0x0025, 0x0060, 0x0040, 0xc3bc, 0xc3a4, 0xc39c, 0xc3b6,	// $, %, `, @, ü, ä, Ü, ö
+	0xc384, 0xc396, 0xc39f, 0xc396, 0xc39f, 0xc384, 0xc39c, 0x0020,	// Ä, Ö, ß, Ö, ß, Ä, Ü, ↑ (replaced with space)
+	0xc3a0, 0xc3a2, 0xc3a7, 0xc3a9, 0xc3a8, 0xc3aa, 0xc3af, 0xc3ae,	// à, â, ç, é, è, ê, ï, î
+	0xc3b4, 0xc3b9, 0xc3bb, 0xc3a1, 0xc3ac, 0xc3b2					// ô, ù, û, á, ì, ò
+};
+
+#endif
+
 CharsetRendererV2::CharsetRendererV2(ScummEngine *vm, Common::Language language)
 	: CharsetRendererV3(vm) {
 
@@ -762,6 +773,126 @@ CharsetRendererV2::CharsetRendererV2(ScummEngine *vm, Common::Language language)
 #endif
 }
 
+#ifdef USE_TTS
+
+Common::U32String CharsetRendererV2::convertText(const Common::String &text, Common::Language language) const {
+	const byte *map = nullptr;
+	int mapLen = 0;
+	Common::CodePage encoding;
+
+	switch (language) {
+	case Common::EN_ANY:
+	case Common::EN_GRB:
+	case Common::EN_USA:
+		if (_vm->_game.version == 1 && !(_vm->_game.features & GF_DEMO)) {
+			map = englishCharsetDataV1;
+			mapLen = ARRAYSIZE(englishCharsetDataV1);
+			encoding = Common::CodePage::kUtf8;
+		} else {
+			return Common::U32String(text, Common::CodePage::kDos850);
+		}
+		break;
+	case Common::DE_DEU:
+		if (_vm->_game.version == 0) {
+			map = germanCharsetDataV0;
+			mapLen = ARRAYSIZE(germanCharsetDataV0);
+		} else {
+			map = germanCharsetDataV2;
+			mapLen = ARRAYSIZE(germanCharsetDataV2);
+		}
+		encoding = Common::CodePage::kUtf8;
+		break;
+	case Common::FR_FRA:
+		map = frenchCharsetDataV2;
+		mapLen = ARRAYSIZE(frenchCharsetDataV2);
+		encoding = Common::CodePage::kUtf8;
+		break;
+	case Common::IT_ITA:
+		map = italianCharsetDataV2;
+		mapLen = ARRAYSIZE(italianCharsetDataV2);
+		encoding = Common::CodePage::kUtf8;
+		break;
+	case Common::ES_ESP:
+		map = spanishCharsetDataV2;
+		mapLen = ARRAYSIZE(spanishCharsetDataV2);
+		encoding = Common::CodePage::kUtf8;
+		break;
+	case Common::RU_RUS:
+		map = russCharsetDataV2;
+		mapLen = ARRAYSIZE(russCharsetDataV2);
+		encoding = Common::CodePage::kDos866;
+
+		if ((_vm->_game.id != GID_MANIAC && _vm->_game.id != GID_ZAK) || _vm->_game.version != 2) {
+			return Common::U32String(text, Common::CodePage::kDos866);
+		}
+		break;
+	case Common::HE_ISR:
+		encoding = Common::CodePage::kDos862;
+		break;
+	default:
+		return Common::U32String(text, _vm->getDialogCodePage());
+	}
+
+	const byte *bytes = (const byte *)text.c_str();
+	byte *convertedBytes = new byte[text.size() * 2 + 1];
+
+	int i = 0;
+	for (const byte *b = bytes; *b; ++b) {
+		if (map) {
+			// Change DOS 850 code for © to UTF-8
+			if (language != Common::RU_RUS && *b == 0xb8) {
+				convertedBytes[i] = 0xc2;
+				convertedBytes[i + 1] = 0xa9;
+				i += 2;
+				continue;
+			}
+
+			bool inMap = false;
+			for (int j = 0; j < mapLen; j += 2) {
+				if (*b == map[j]) {
+					if (language != Common::RU_RUS) {
+						byte firstByte = (specialCharactersEncoding[map[j + 1]] >> 8) & 0xff;
+
+						if (firstByte != 0) {
+							convertedBytes[i] = firstByte;
+							convertedBytes[i + 1] = specialCharactersEncoding[map[j + 1]] & 0xff;
+							i++;
+						} else {
+							convertedBytes[i] = specialCharactersEncoding[map[j + 1]] & 0xff;
+						}
+					} else {
+						convertedBytes[i] = map[j + 1];
+					}
+
+					inMap = true;
+					break;
+				}
+			}
+
+			if (!inMap) {
+				convertedBytes[i] = *b;
+			}
+		} else {
+			convertedBytes[i] = *b;
+
+			if (language == Common::HE_ISR) {
+				convertedBytes[i] += 63;
+			}
+		}
+
+		i++;
+	}
+
+	convertedBytes[i] = 0;
+
+	Common::U32String result((char *)convertedBytes, encoding);
+	delete[] convertedBytes;
+
+	return result;
+}
+
+#endif
+
 CharsetRendererV2::~CharsetRendererV2() {
 	if (_deleteFontPtr)
 		delete[] _fontPtr;
diff --git a/engines/scumm/charset.h b/engines/scumm/charset.h
index 77742e15662..7f288d7b4df 100644
--- a/engines/scumm/charset.h
+++ b/engines/scumm/charset.h
@@ -115,6 +115,10 @@ public:
 	virtual byte getColor() { return _color; }
 
 	void saveLoadWithSerializer(Common::Serializer &ser);
+
+#ifdef USE_TTS
+	virtual Common::U32String convertText(const Common::String &text, Common::Language language) const { return Common::U32String(text, _vm->getDialogCodePage()); }
+#endif
 };
 
 class CharsetRendererCommon : public CharsetRenderer {
@@ -281,6 +285,10 @@ public:
 
 	void setCurID(int32 id) override {}
 	int getCharWidth(uint16 chr) const override { return 8; }
+
+#ifdef USE_TTS
+	Common::U32String convertText(const Common::String &text, Common::Language language) const override;
+#endif
 };
 
 class CharsetRendererMac : public CharsetRendererCommon {
diff --git a/engines/scumm/detection.h b/engines/scumm/detection.h
index ae5f5efabfa..19eaea2e458 100644
--- a/engines/scumm/detection.h
+++ b/engines/scumm/detection.h
@@ -37,6 +37,7 @@ namespace Scumm {
 #define GAMEOPTION_NETWORK                                   GUIO_GAMEOPTIONS6
 #define GAMEOPTION_COPY_PROTECTION                           GUIO_GAMEOPTIONS7
 #define GAMEOPTION_USE_REMASTERED_AUDIO                      GUIO_GAMEOPTIONS8
+#define GAMEOPTION_TTS                                       GUIO_GAMEOPTIONS9
 
 /**
  * Descriptor of a specific SCUMM game. Used internally to store
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 942847b8e16..4deb7273769 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -154,241 +154,241 @@ static const PlainGameDescriptor gameDescriptions[] = {
 // only a single unique variant. This is used to help the detector quickly
 // decide whether it has to worry about distinguishing multiple variants or not.
 static const GameSettings gameVariantsTable[] = {
-	{"maniac", "Apple II",   0, GID_MANIAC, 0, 0, MDT_APPLEIIGS, 0, Common::kPlatformApple2GS, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_ENHANCEMENTS)},
-	{"maniac", "C64",        0, GID_MANIAC, 0, 0, MDT_C64, 0, Common::kPlatformC64, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI) },
-	{"maniac", "C64 Demo",   0, GID_MANIAC, 0, 0, MDT_C64, GF_DEMO, Common::kPlatformC64, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI) },
-	{"maniac", "V1",      "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, 0, Common::kPlatformDOS, GUIO10(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformDOS, GUIO8(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ORIGINALGUI)},
-	{"maniac", "NES",        0, GID_MANIAC, 1, 0, MDT_NONE,  0, Common::kPlatformNES, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"maniac", "V2",      "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO9(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"maniac", "V2 Demo", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformDOS, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI)},
-	{"maniac", "Remastered", 0, GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DOUBLEFINE_PAK, Common::kPlatformDOS, GUIO9(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-
-	{"zak", "V1",       "v1", GID_ZAK, 1, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO9(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"zak", "V2",       "v2", GID_ZAK, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO8(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"zak", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"zakloom", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI)},
-	{"indyloom", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI)},
-	{"indyzak", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI)},
-
-	{"indy3", "EGA",      "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"indy3", "Mac",      "ega", GID_INDY3, 3, 0, MDT_MACINTOSH,             0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERMACINTOSHBW, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT)},
-	{"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR,             0, UNK, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERCGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"indy3", "VGA",      "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS,                  Common::kPlatformDOS, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"indy3", "Steam",  "steam", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, UNK, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"indy3", "FM-TOWNS",     0, GID_INDY3, 3, 0, MDT_TOWNS,             GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-
-	{"loom", "EGA",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"loom", "Mac",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR,                                  0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDERMACINTOSHBW, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT)},
-	{"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS,                        0, UNK, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"loom", "PC-Engine",    0, GID_LOOM, 3, 0, MDT_NONE,                         GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS)},
-	{"loom", "FM-TOWNS",     0, GID_LOOM, 3, 0, MDT_TOWNS,                        GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"loom", "VGA",      "vga", GID_LOOM, 4, 0, MDT_NONE,                         GF_AUDIOTRACKS,             Common::kPlatformDOS, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"loom", "Steam",  "steam", GID_LOOM, 4, 0, MDT_NONE,                         GF_AUDIOTRACKS,  UNK, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"loom", "Demo",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO4(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI)},
-
-	{"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_16COLOR, Common::kPlatformDOS, GUIO5(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI)},
-
-	{"monkey", "VGA",      "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"monkey", "VGA Demo",      "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO3(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "EGA",      "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_16COLOR,     Common::kPlatformDOS, GUIO7(GUIO_NOSPEECH, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR,                        GF_16COLOR,     Common::kPlatformAtariST, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "Demo",     "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB,            GF_16COLOR | GF_DEMO,     Common::kPlatformDOS, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "CD",           0, GID_MONKEY,     5, 0, MDT_ADLIB,                        GF_AUDIOTRACKS, UNK, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "SE",           0, GID_MONKEY,     5, 0, MDT_ADLIB,                        GF_AUDIOTRACKS | GF_DOUBLEFINE_PAK, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_USE_REMASTERED_AUDIO)},
-	{"monkey", "Mac",          0, GID_MONKEY,     5, 0, MDT_MACINTOSH,                    0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT)},
-	{"monkey", "FM-TOWNS",     0, GID_MONKEY,     5, 0, MDT_TOWNS,                        GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "SEGA",         0, GID_MONKEY,     5, 0, MDT_NONE,                         GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey", "SE Talkie",    0, GID_MONKEY,     5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_AUDIOTRACKS | GF_ULTIMATE_TALKIE, UNK, GUIO2(GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI)},
-	{"monkey2", "", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"monkey2", "SE", 0, GID_MONKEY2, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DOUBLEFINE_PAK, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_USE_REMASTERED_AUDIO)},
-	{"monkey2", "Demo", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO2(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS)},
-	{"monkey2", "Amiga", 0, GID_MONKEY2,  5, 0, MDT_AMIGA, 0, Common::kPlatformAmiga, GUIO5(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"monkey2", "Mac", 0, GID_MONKEY2,  5, 0, MDT_MACINTOSH, 0, UNK, GUIO5(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT)},
-	{"monkey2", "FM-TOWNS", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO7(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"monkey2", "SE Talkie",0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_ULTIMATE_TALKIE, UNK, GUIO2(GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI)},
-	{"atlantis", "", 0, GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"atlantis", "Steam", "steam", GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"atlantis", "Floppy", 0, GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"atlantis", "Amiga", 0, GID_INDY4,  5, 0, MDT_AMIGA, 0, Common::kPlatformAmiga, GUIO5(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION)},
-	{"atlantis", "Mac", 0, GID_INDY4,    5, 0, 0, 0, UNK, GUIO3(GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT)},
-	{"atlantis", "Mac Floppy", 0, GID_INDY4,    5, 0, 0, 0, UNK, GUIO5(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT)},
-	{"atlantis", "FM-TOWNS", 0, GID_INDY4,    5, 0, MDT_TOWNS | MDT_ADLIB, 0, Common::kPlatformFMTowns, GUIO5(GUIO_MIDITOWNS, GUIO_MIDIADLIB, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-
-	{"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"tentacle", "Remastered", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY | GF_DOUBLEFINE_PAK, UNK, GUIO4(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_USE_REMASTERED_AUDIO)},
-	{"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO4(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-
-	{"samnmax",  "", 0, GID_SAMNMAX,  6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-	{"samnmax",  "Floppy", 0, GID_SAMNMAX,  6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO4(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI)},
-
-	{"ft",   "", 0, GID_FT,  7, 0, MDT_NONE, 0, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-	{"ft",   "Remastered", 0, GID_FT,  7, 0, MDT_NONE, GF_DOUBLEFINE_PAK, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-	{"ft",   "Demo", 0, GID_FT,  7, 0, MDT_NONE, GF_DEMO, UNK, GUIO3(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-
-	{"dig",  "", 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-	{"dig",  "Demo", 0, GID_DIG, 7, 0, MDT_NONE, GF_DEMO, UNK, GUIO3(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-	{"dig",  "Steam", "steam", GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-
-	{"comi", "", 0, GID_CMI, 8, 0, MDT_NONE, 0, Common::kPlatformWindows, GUIO5(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
-	{"comi", "Demo", 0, GID_CMI, 8, 0, MDT_NONE, GF_DEMO, Common::kPlatformWindows, GUIO5(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO)},
+	{"maniac", "Apple II",   0, GID_MANIAC, 0, 0, MDT_APPLEIIGS, 0, Common::kPlatformApple2GS, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"maniac", "C64",        0, GID_MANIAC, 0, 0, MDT_C64, 0, Common::kPlatformC64, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS) },
+	{"maniac", "C64 Demo",   0, GID_MANIAC, 0, 0, MDT_C64, GF_DEMO, Common::kPlatformC64, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS) },
+	{"maniac", "V1",      "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, 0, Common::kPlatformDOS, GUIO11(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformDOS, GUIO9(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"maniac", "NES",        0, GID_MANIAC, 1, 0, MDT_NONE,  0, Common::kPlatformNES, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"maniac", "V2",      "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO10(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"maniac", "V2 Demo", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformDOS, GUIO8(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"maniac", "Remastered", 0, GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DOUBLEFINE_PAK, Common::kPlatformDOS, GUIO10(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+
+	{"zak", "V1",       "v1", GID_ZAK, 1, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO10(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGABW, GUIO_RENDERCGACOMP, GUIO_RENDERCGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"zak", "V2",       "v2", GID_ZAK, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO9(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"zak", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"zakloom", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indyloom", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indyzak", "FM-TOWNS",    0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"indy3", "EGA",      "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indy3", "Mac",      "ega", GID_INDY3, 3, 0, MDT_MACINTOSH,             0, UNK, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERMACINTOSHBW, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR,             0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERCGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indy3", "VGA",      "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS,                  Common::kPlatformDOS, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indy3", "Steam",  "steam", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, UNK, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"indy3", "FM-TOWNS",     0, GID_INDY3, 3, 0, MDT_TOWNS,             GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"loom", "EGA",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO7(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"loom", "Mac",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR,                                  0, UNK, GUIO7(GUIO_NOSPEECH, GUIO_RENDERMACINTOSHBW, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS,                        0, UNK, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"loom", "PC-Engine",    0, GID_LOOM, 3, 0, MDT_NONE,                         GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"loom", "FM-TOWNS",     0, GID_LOOM, 3, 0, MDT_TOWNS,                        GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"loom", "VGA",      "vga", GID_LOOM, 4, 0, MDT_NONE,                         GF_AUDIOTRACKS,             Common::kPlatformDOS, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"loom", "Steam",  "steam", GID_LOOM, 4, 0, MDT_NONE,                         GF_AUDIOTRACKS,  UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"loom", "Demo",      "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_16COLOR, Common::kPlatformDOS, GUIO6(GUIO_NOSPEECH, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"monkey", "VGA",      "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"monkey", "VGA Demo",      "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO4(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "EGA",      "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_16COLOR,     Common::kPlatformDOS, GUIO8(GUIO_NOSPEECH, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR,                        GF_16COLOR,     Common::kPlatformAtariST, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "Demo",     "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB,            GF_16COLOR | GF_DEMO,     Common::kPlatformDOS, GUIO8(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDERHERCGREEN, GUIO_RENDERHERCAMBER, GUIO_RENDERCGA, GUIO_RENDERAMIGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "CD",           0, GID_MONKEY,     5, 0, MDT_ADLIB,                        GF_AUDIOTRACKS, UNK, GUIO6(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "SE",           0, GID_MONKEY,     5, 0, MDT_ADLIB,                        GF_AUDIOTRACKS | GF_DOUBLEFINE_PAK, UNK, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_USE_REMASTERED_AUDIO, GAMEOPTION_TTS)},
+	{"monkey", "Mac",          0, GID_MONKEY,     5, 0, MDT_MACINTOSH,                    0, UNK, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"monkey", "FM-TOWNS",     0, GID_MONKEY,     5, 0, MDT_TOWNS,                        GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO7(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "SEGA",         0, GID_MONKEY,     5, 0, MDT_NONE,                         GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO5(GUIO_NOSPEECH, GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey", "SE Talkie",    0, GID_MONKEY,     5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_AUDIOTRACKS | GF_ULTIMATE_TALKIE, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey2", "", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"monkey2", "SE", 0, GID_MONKEY2, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DOUBLEFINE_PAK, UNK, GUIO7(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_USE_REMASTERED_AUDIO, GAMEOPTION_TTS)},
+	{"monkey2", "Demo", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_DEMO, UNK, GUIO3(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"monkey2", "Amiga", 0, GID_MONKEY2,  5, 0, MDT_AMIGA, 0, Common::kPlatformAmiga, GUIO6(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"monkey2", "Mac", 0, GID_MONKEY2,  5, 0, MDT_MACINTOSH, 0, UNK, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"monkey2", "FM-TOWNS", 0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO8(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"monkey2", "SE Talkie",0, GID_MONKEY2,  5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_ULTIMATE_TALKIE, UNK, GUIO3(GUIO_RENDEREGA, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"atlantis", "", 0, GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO4(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"atlantis", "Steam", "steam", GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO4(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"atlantis", "Floppy", 0, GID_INDY4,    5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO6(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"atlantis", "Amiga", 0, GID_INDY4,  5, 0, MDT_AMIGA, 0, Common::kPlatformAmiga, GUIO6(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_TTS)},
+	{"atlantis", "Mac", 0, GID_INDY4,    5, 0, 0, 0, UNK, GUIO4(GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"atlantis", "Mac Floppy", 0, GID_INDY4,    5, 0, 0, 0, UNK, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_COPY_PROTECTION, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"atlantis", "FM-TOWNS", 0, GID_INDY4,    5, 0, MDT_TOWNS | MDT_ADLIB, 0, Common::kPlatformFMTowns, GUIO6(GUIO_MIDITOWNS, GUIO_MIDIADLIB, GAMEOPTION_TRIM_FMTOWNS_TO_200_PIXELS, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO4(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"tentacle", "Remastered", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY | GF_DOUBLEFINE_PAK, UNK, GUIO5(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_USE_REMASTERED_AUDIO, GAMEOPTION_TTS)},
+	{"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"samnmax",  "", 0, GID_SAMNMAX,  6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO4(GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+	{"samnmax",  "Floppy", 0, GID_SAMNMAX,  6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO5(GUIO_NOSPEECH, GUIO_RENDEREGA, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_TTS)},
+
+	{"ft",   "", 0, GID_FT,  7, 0, MDT_NONE, 0, UNK, GUIO5(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+	{"ft",   "Remastered", 0, GID_FT,  7, 0, MDT_NONE, GF_DOUBLEFINE_PAK, UNK, GUIO5(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+	{"ft",   "Demo", 0, GID_FT,  7, 0, MDT_NONE, GF_DEMO, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+
+	{"dig",  "", 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO5(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+	{"dig",  "Demo", 0, GID_DIG, 7, 0, MDT_NONE, GF_DEMO, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+	{"dig",  "Steam", "steam", GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO5(GUIO_NOMIDI, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+
+	{"comi", "", 0, GID_CMI, 8, 0, MDT_NONE, 0, Common::kPlatformWindows, GUIO6(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
+	{"comi", "Demo", 0, GID_CMI, 8, 0, MDT_NONE, GF_DEMO, Common::kPlatformWindows, GUIO6(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 6
-	{"activity", "", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"funpack",  0, 0, GID_FUNPACK, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"fbpack",   0, 0, GID_HEGAME,  6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"activity", "", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"funpack",  0, 0, GID_FUNPACK, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"fbpack",   0, 0, GID_HEGAME,  6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"brstorm", 0, 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"fbear", "HE 62", 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"fbear", "HE 70", 0, GID_FBEAR, 6, 70, MDT_NONE,             GF_USE_KEY, Common::kPlatformWindows, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"brstorm", 0, 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"fbear", "HE 62", 0, GID_FBEAR, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"fbear", "HE 70", 0, GID_FBEAR, 6, 70, MDT_NONE,             GF_USE_KEY, Common::kPlatformWindows, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"puttmoon", "", 0, GID_PUTTMOON, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttmoon", "Demo", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttmoon", "HE 70", 0, GID_PUTTMOON, 6, 70, MDT_NONE,             GF_USE_KEY, Common::kPlatformWindows, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"puttmoon", "", 0, GID_PUTTMOON, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttmoon", "Demo", 0, GID_HEGAME, 6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttmoon", "HE 70", 0, GID_PUTTMOON, 6, 70, MDT_NONE,             GF_USE_KEY, Common::kPlatformWindows, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"puttputt", "HE 60", 0, GID_HEGAME,   6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttputt", "HE 61", 0, GID_HEGAME,   6, 61, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttputt", "HE 62", 0, GID_HEGAME,   6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttputt", "Demo",  0, GID_PUTTDEMO, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO2(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"puttputt", "HE 60", 0, GID_HEGAME,   6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttputt", "HE 61", 0, GID_HEGAME,   6, 61, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttputt", "HE 62", 0, GID_HEGAME,   6, 62, MDT_ADLIB | MDT_MIDI, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttputt", "Demo",  0, GID_PUTTDEMO, 6, 60, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// The following are meant to be generic HE game variants and as such do
 	// not specify a game ID. Make sure that these are last in the table, else
 	// they'll override more specific entries that follow later on.
-	{"", "HE 70",   0, GID_HEGAME, 6,  70, MDT_NONE, GF_USE_KEY, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"", "HE 70",   0, GID_HEGAME, 6,  70, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// HE CUP demos
-	{"", "HE CUP",  0, GID_HECUP,  6, 200, MDT_NONE, 0, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOSPEECH)},
+	{"", "HE CUP",  0, GID_HECUP,  6, 200, MDT_NONE, 0, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOSPEECH, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 7.1
 	// The first version to use 640x480 resolution and wizImages
 	// There are also 7.1 versions of freddemo, airdemo and farmdemo
-	{"catalog", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"farm", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddi", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddi", "HE 71",   0, GID_FREDDI, 6,  71, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddi", "HE 73",   0, GID_FREDDI, 6,  73, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"catalog", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"farm", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddi", "", 0, GID_HEGAME, 6, 71, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddi", "HE 71",   0, GID_FREDDI, 6,  71, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddi", "HE 73",   0, GID_FREDDI, 6,  73, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 7.2
-	{"airport", "", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"airport", "", 0, GID_HEGAME, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Changed o_getResourceSize to cover all resource types
-	{"puttzoo", "", 0, GID_PUTTZOO, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttzoo", "HE 72", 0, GID_PUTTZOO, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttzoo", "HE 98.5", 0, GID_PUTTZOO, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttzoo", "HE 99", 0, GID_PUTTZOO, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttzoo", "HE 100", 0, GID_PUTTZOO, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"puttzoo", "", 0, GID_PUTTZOO, 6, 73, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttzoo", "HE 72", 0, GID_PUTTZOO, 6, 72, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttzoo", "HE 98.5", 0, GID_PUTTZOO, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttzoo", "HE 99", 0, GID_PUTTZOO, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttzoo", "HE 100", 0, GID_PUTTZOO, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Added VAR_PLATFORM variable
-	{"jungle", "", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"jungle", "", 0, GID_HEGAME, 6, 74, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 8.0 ?  Scummsrc.80
-	{"freddi2", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"pajama", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"freddi2", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"pajama", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"balloon", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"dog", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"maze", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"balloon", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"dog", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"maze", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"water", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"water", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// condMaskCode value changed in setUserCondition & setTalkCondition
-	{"putttime", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"socks", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"putttime", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"socks", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 9.0 ?  Scummsys.90
-	{"baseball", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"thinkerk", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"thinker1", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"spyfox", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"baseball", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"thinkerk", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"thinker1", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"spyfox", "", 0, GID_HEGAME, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"freddi3", "", 0, GID_FREDDI3, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS)},
-	{"freddi3", "HE 99", 0, GID_FREDDI3, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"freddi3", "", 0, GID_FREDDI3, 6, 90, MDT_NONE, GF_USE_KEY, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"freddi3", "HE 99", 0, GID_FREDDI3, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 9.5 ?  Scummsys.95
-	{"pajama2", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"pajama2", "HE 99", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"chase", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"pajama2", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"pajama2", "HE 99", 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_NO_BIDI, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"chase", "", 0, GID_HEGAME, 6, 95, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 9.8 ?  Scummsys.98
 	// these and later games can easily be identified by the .(a) file instead of a .he1
 	// and INIB chunk in the .he0
-	{"lost", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"lost", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"puttrace", "HE 98",   0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttrace", "HE 98.5", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttrace", "HE 99",   0, GID_PUTTRACE, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"puttrace", "HE 98",   0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttrace", "HE 98.5", 0, GID_PUTTRACE, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttrace", "HE 99",   0, GID_PUTTRACE, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"bluesabctime", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"BluesBirthday", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"BluesBirthday", "Red", 0, GID_BIRTHDAYRED, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"BluesBirthday", "Yellow", 0, GID_BIRTHDAYYELLOW, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"soccer", "", 0, GID_SOCCER, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"bluesabctime", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"BluesBirthday", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"BluesBirthday", "Red", 0, GID_BIRTHDAYRED, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"BluesBirthday", "Yellow", 0, GID_BIRTHDAYYELLOW, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"soccer", "", 0, GID_SOCCER, 6, 98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Global scripts increased to 2048
-	{"blues123time", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddi4", "",       0, GID_FREDDI4, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS)},
-	{"freddi4", "unenc",  0, GID_FREDDI4, 6, 98, MDT_NONE,              GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS)},
-	{"freddi4", "HE 99",  0, GID_FREDDI4, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS)},
+	{"blues123time", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddi4", "",       0, GID_FREDDI4, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"freddi4", "unenc",  0, GID_FREDDI4, 6, 98, MDT_NONE,              GF_HE_985, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
+	{"freddi4", "HE 99",  0, GID_FREDDI4, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_ENHANCEMENTS, GAMEOPTION_TTS)},
 
 	// Humongous Entertainment Scumm Version 9.9 ?  Scummsys.99
-	{"football", 0, 0, GID_FOOTBALL, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_NETWORK)},
-	{"pajama3", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"puttcircus", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_HE_NO_BIDI, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"spyfox2", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"mustard", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"football", 0, 0, GID_FOOTBALL, 6, 99, MDT_NONE, GF_USE_KEY, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
+	{"pajama3", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"puttcircus", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_HE_NO_BIDI, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"spyfox2", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"mustard", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Added the use of fonts
-	{"FreddisFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"SamsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"PuttsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"FreddisFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"SamsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"PuttsFunShop", 0, 0, GID_FUNSHOP, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Added the use of smacker videos
-	{"BluesTreasureHunt", 0, 0, GID_TREASUREHUNT, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"BluesTreasureHunt", 0, 0, GID_TREASUREHUNT, 6, 99, MDT_NONE, GF_HE_LOCALIZED | GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Added 16bit color
-	{"arttime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"baseball2001", 0, 0, GID_BASEBALL2001, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_NETWORK)},
-	{"readtime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"SoccerMLS", 0, 0, GID_SOCCERMLS, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"spyozon", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"arttime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"baseball2001", 0, 0, GID_BASEBALL2001, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO6(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
+	{"readtime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"SoccerMLS", 0, 0, GID_SOCCERMLS, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"spyozon", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
-	{"freddicove", "",       0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddicove", "unenc",  0, GID_HEGAME, 6,  99, MDT_NONE,              GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"freddicove", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"freddicove", "",       0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddicove", "unenc",  0, GID_HEGAME, 6,  99, MDT_NONE,              GF_HE_LOCALIZED | GF_16BIT_COLOR | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"freddicove", "HE 100", 0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Restructured the Scumm engine
-	{"pjgames", 0, 0, GID_PJGAMES, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"pjgames", 0, 0, GID_PJGAMES, 6, 100, MDT_NONE, GF_USE_KEY | GF_HE_LOCALIZED | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	// Added the use of bink videos
-	{"Soccer2004", 0, 0, GID_SOCCER2004, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT)},
+	{"Soccer2004", 0, 0, GID_SOCCER2004, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_TTS)},
 
 	// U32 code required, for testing only
-	{"moonbase", "1.0", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK)},
-	{"moonbase", "1.1", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK)},
-	{"moonbase", "Demo", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_DEMO, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK)},
+	{"moonbase", "1.0", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
+	{"moonbase", "1.1", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
+	{"moonbase", "Demo", 0, GID_MOONBASE, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR | GF_DEMO, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
 
 	// HE100 games, which use older o72_debugInput code
-	{"Baseball2003", 0, 0, GID_BASEBALL2003, 6, 101, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT)},
-	{"basketball", 0, 0, GID_BASKETBALL, 6, 101, MDT_NONE, GF_USE_KEY| GF_16BIT_COLOR, UNK, GUIO3(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT)},
-	{"football2002", 0, 0, GID_FOOTBALL2002, 6, 101, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK)},
+	{"Baseball2003", 0, 0, GID_BASEBALL2003, 6, 101, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"basketball", 0, 0, GID_BASKETBALL, 6, 101, MDT_NONE, GF_USE_KEY| GF_16BIT_COLOR, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_TTS)},
+	{"football2002", 0, 0, GID_FOOTBALL2002, 6, 101, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_NETWORK, GAMEOPTION_TTS)},
 
 	// The following are meant to be generic HE game variants and as such do
 	// not specify a game ID. Make sure that these are last in the table, else
 	// they'll override more specific entries that follow later on.
-	{"", "HE 71",   0, GID_HEGAME, 6,  71, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 72",   0, GID_HEGAME, 6,  72, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 73",   0, GID_HEGAME, 6,  73, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 74",   0, GID_HEGAME, 6,  74, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 80",   0, GID_HEGAME, 6,  80, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 85",   0, GID_HEGAME, 6,  85, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 90",   0, GID_HEGAME, 6,  90, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 95",   0, GID_HEGAME, 6,  95, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 98",   0, GID_HEGAME, 6,  98, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 98.5", 0, GID_HEGAME, 6,  98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 99",   0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 99.5", 0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY | GF_HE_995, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 100",  0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
-	{"", "HE 101",  0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO4(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE)},
+	{"", "HE 71",   0, GID_HEGAME, 6,  71, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 72",   0, GID_HEGAME, 6,  72, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 73",   0, GID_HEGAME, 6,  73, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 74",   0, GID_HEGAME, 6,  74, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 80",   0, GID_HEGAME, 6,  80, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 85",   0, GID_HEGAME, 6,  85, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 90",   0, GID_HEGAME, 6,  90, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 95",   0, GID_HEGAME, 6,  95, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 98",   0, GID_HEGAME, 6,  98, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 98.5", 0, GID_HEGAME, 6,  98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 99",   0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 99.5", 0, GID_HEGAME, 6,  99, MDT_NONE, GF_USE_KEY | GF_HE_995, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 100",  0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
+	{"", "HE 101",  0, GID_HEGAME, 6, 100, MDT_NONE, GF_USE_KEY, UNK, GUIO5(GUIO_NOLAUNCHLOAD, GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_AUDIO_OVERRIDE, GAMEOPTION_TTS)},
 
 	{NULL, NULL, 0, 0, 0, MDT_NONE, 0, 0, UNK, 0}
 };
diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp
index 33e4744d84d..807df6b3daf 100644
--- a/engines/scumm/dialogs.cpp
+++ b/engines/scumm/dialogs.cpp
@@ -1204,6 +1204,27 @@ GUI::CheckboxWidget *ScummOptionsContainerWidget::createCopyProtectionCheckbox(G
 	);
 }
 
+#ifdef USE_TTS
+
+GUI::CheckboxWidget *ScummOptionsContainerWidget::createEnableTTSCheckbox(GuiObject *boss, const Common::String &name) {
+	// Set a "tts_enabled" bool specifically for this domain, since otherwise, the game options will take the "tts_enabled" bool
+	// from global options (i.e. when games using this checkbox are added for the first time, they don't check the default domain, 
+	// and instead try to get from the game's specific domain, but the "tts_enabled" bool doesn't exist in that domain yet, so it
+	// pulls from the app domain instead. Therefore, if the user has TTS enabled for the ScummVM domain, the TTS game option 
+	// will default to enabled. This doesn't match the behavior of other games, which always default TTS to false, so make sure 
+	// TTS defaults to false by adding the bool manually here)
+	if (!ConfMan.hasKey("tts_enabled", _domain)) {
+		ConfMan.setBool("tts_enabled", false, _domain);
+	}
+
+	return new GUI::CheckboxWidget(boss, name,
+		_("Enable Text to Speech"),
+		_("Use TTS to read text in the game (if TTS is available)")
+	);
+}
+
+#endif
+
 void ScummOptionsContainerWidget::updateAdjustmentSlider(GUI::SliderWidget *slider, GUI::StaticTextWidget *value) {
 	int adjustment = slider->getValue();
 	const char *sign = "";
@@ -1334,6 +1355,9 @@ LoomEgaGameOptionsWidget::LoomEgaGameOptionsWidget(GuiObject *boss, const Common
 	createEnhancementsWidget(widgetsBoss(), "LoomEgaGameOptionsDialog");
 	_enableOriginalGUICheckbox = createOriginalGUICheckbox(widgetsBoss(), "LoomEgaGameOptionsDialog.EnableOriginalGUI");
 	_enableCopyProtectionCheckbox = createCopyProtectionCheckbox(widgetsBoss(), "LoomEgaGameOptionsDialog.EnableCopyProtection");
+#ifdef USE_TTS
+	_enableTTSCheckbox = createEnableTTSCheckbox(widgetsBoss(), "LoomEgaGameOptionsDialog.EnableTTS");
+#endif
 }
 
 void LoomEgaGameOptionsWidget::load() {
@@ -1349,6 +1373,9 @@ void LoomEgaGameOptionsWidget::load() {
 
 	_enableOriginalGUICheckbox->setState(ConfMan.getBool("original_gui", _domain));
 	_enableCopyProtectionCheckbox->setState(ConfMan.getBool("copy_protection", _domain));
+#ifdef USE_TTS
+	_enableTTSCheckbox->setState(ConfMan.getBool("tts_enabled", _domain));
+#endif
 }
 
 bool LoomEgaGameOptionsWidget::save() {
@@ -1357,6 +1384,9 @@ bool LoomEgaGameOptionsWidget::save() {
 	ConfMan.setInt("loom_overture_ticks", _overtureTicksSlider->getValue(), _domain);
 	ConfMan.setBool("original_gui", _enableOriginalGUICheckbox->getState(), _domain);
 	ConfMan.setBool("copy_protection", _enableCopyProtectionCheckbox->getState(), _domain);
+#ifdef USE_TTS
+	ConfMan.setBool("tts_enabled", _enableTTSCheckbox->getState(), _domain);
+#endif
 	return true;
 }
 
@@ -1368,6 +1398,11 @@ void LoomEgaGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Commo
 				.addPadding(0, 0, 10, 0)
 				.addWidget("EnableOriginalGUI", "Checkbox")
 				.addWidget("EnableCopyProtection", "Checkbox");
+
+#ifdef USE_TTS
+	layouts.addWidget("EnableTTS", "Checkbox");
+#endif
+
 	addEnhancementsLayout(layouts)
 		.closeLayout()
 			.addLayout(GUI::ThemeLayout::kLayoutHorizontal, 12)
@@ -1418,6 +1453,10 @@ MacGameOptionsWidget::MacGameOptionsWidget(GuiObject *boss, const Common::String
 
 	if (gameId == GID_MONKEY || gameId == GID_MONKEY2 || (gameId == GID_INDY4 && extra == "Floppy"))
 		_enableCopyProtectionCheckbox = createCopyProtectionCheckbox(widgetsBoss(), "MacGameOptionsWidget.EnableCopyProtection");
+
+#ifdef USE_TTS
+	_enableTTSCheckbox = createEnableTTSCheckbox(widgetsBoss(), "MacGameOptionsWidget.EnableTTS");
+#endif
 }
 
 void MacGameOptionsWidget::load() {
@@ -1442,6 +1481,10 @@ void MacGameOptionsWidget::load() {
 
 	if (_enableCopyProtectionCheckbox)
 		_enableCopyProtectionCheckbox->setState(ConfMan.getBool("copy_protection", _domain));
+
+#ifdef USE_TTS
+	_enableTTSCheckbox->setState(ConfMan.getBool("tts_enabled", _domain));
+#endif
 }
 
 bool MacGameOptionsWidget::save() {
@@ -1453,6 +1496,10 @@ bool MacGameOptionsWidget::save() {
 	if (_enableCopyProtectionCheckbox)
 		ConfMan.setBool("copy_protection", _enableCopyProtectionCheckbox->getState(), _domain);
 
+#ifdef USE_TTS
+	ConfMan.setBool("tts_enabled", _enableTTSCheckbox->getState(), _domain);
+#endif
+
 	return res;
 }
 
@@ -1468,6 +1515,10 @@ void MacGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::S
 	if (_enableCopyProtectionCheckbox)
 		layouts.addWidget("EnableCopyProtection", "Checkbox");
 
+#ifdef USE_TTS
+	layouts.addWidget("EnableTTS", "Checkbox");
+#endif
+
 	addEnhancementsLayout(layouts)
 			.closeLayout()
 			.addLayout(GUI::ThemeLayout::kLayoutHorizontal, 12)
@@ -1532,6 +1583,9 @@ LoomVgaGameOptionsWidget::LoomVgaGameOptionsWidget(GuiObject *boss, const Common
 
 	createEnhancementsWidget(widgetsBoss(), "LoomVgaGameOptionsDialog");
 	_enableOriginalGUICheckbox = createOriginalGUICheckbox(widgetsBoss(), "LoomVgaGameOptionsDialog.EnableOriginalGUI");
+#ifdef USE_TTS
+	_enableTTSCheckbox = createEnableTTSCheckbox(widgetsBoss(), "LoomVgaGameOptionsDialog.EnableTTS");
+#endif
 }
 
 void LoomVgaGameOptionsWidget::load() {
@@ -1546,12 +1600,18 @@ void LoomVgaGameOptionsWidget::load() {
 	updatePlaybackAdjustmentValue();
 
 	_enableOriginalGUICheckbox->setState(ConfMan.getBool("original_gui", _domain));
+#ifdef USE_TTS
+	_enableTTSCheckbox->setState(ConfMan.getBool("tts_enabled", _domain));
+#endif
 }
 
 bool LoomVgaGameOptionsWidget::save() {
 	ScummOptionsContainerWidget::save();
 	ConfMan.setInt("loom_playback_adjustment", _playbackAdjustmentSlider->getValue(), _domain);
 	ConfMan.setBool("original_gui", _enableOriginalGUICheckbox->getState(), _domain);
+#ifdef USE_TTS
+	ConfMan.setBool("tts_enabled", _enableTTSCheckbox->getState(), _domain);
+#endif
 	return true;
 }
 
@@ -1562,6 +1622,11 @@ void LoomVgaGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Commo
 			.addLayout(GUI::ThemeLayout::kLayoutVertical, 4)
 				.addPadding(0, 0, 10, 0)
 				.addWidget("EnableOriginalGUI", "Checkbox");
+
+#ifdef USE_TTS
+	layouts.addWidget("EnableTTS", "Checkbox");
+#endif
+
 	addEnhancementsLayout(layouts)
 			.closeLayout()
 			.addLayout(GUI::ThemeLayout::kLayoutHorizontal, 12)
@@ -1598,6 +1663,10 @@ MI1CdGameOptionsWidget::MI1CdGameOptionsWidget(GuiObject *boss, const Common::St
 
 	_enableOriginalGUICheckbox = createOriginalGUICheckbox(widgetsBoss(), "MI1CdGameOptionsDialog.EnableOriginalGUI");
 
+#ifdef USE_TTS
+	_enableTTSCheckbox = createEnableTTSCheckbox(widgetsBoss(), "MI1CdGameOptionsDialog.EnableTTS");
+#endif
+
 	if (platform == Common::kPlatformSegaCD)
 		_enableSegaShadowModeCheckbox = createSegaShadowModeCheckbox(widgetsBoss(), "MI1CdGameOptionsDialog.EnableSegaShadowMode");
 
@@ -1651,6 +1720,9 @@ void MI1CdGameOptionsWidget::load() {
 	updateOutlookAdjustmentValue();
 
 	_enableOriginalGUICheckbox->setState(ConfMan.getBool("original_gui", _domain));
+#ifdef USE_TTS
+	_enableTTSCheckbox->setState(ConfMan.getBool("tts_enabled", _domain));
+#endif
 }
 
 bool MI1CdGameOptionsWidget::save() {
@@ -1662,6 +1734,9 @@ bool MI1CdGameOptionsWidget::save() {
 	ConfMan.setInt("mi1_intro_adjustment", _introAdjustmentSlider->getValue(), _domain);
 	ConfMan.setInt("mi1_outlook_adjustment", _outlookAdjustmentSlider->getValue(), _domain);
 	ConfMan.setBool("original_gui", _enableOriginalGUICheckbox->getState(), _domain);
+#ifdef USE_TTS
+	ConfMan.setBool("tts_enabled", _enableTTSCheckbox->getState(), _domain);
+#endif
 	return true;
 }
 
@@ -1678,6 +1753,10 @@ void MI1CdGameOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common:
 	if (platform == Common::kPlatformSegaCD)
 		layouts.addWidget("EnableSegaShadowMode", "Checkbox");
 
+#ifdef USE_TTS
+	layouts.addWidget("EnableTTS", "Checkbox");
+#endif
+
 	addEnhancementsLayout(layouts)
 			.closeLayout()
 			.addLayout(GUI::ThemeLayout::kLayoutHorizontal, 12)
diff --git a/engines/scumm/dialogs.h b/engines/scumm/dialogs.h
index 1bd835a71ca..d3842ce13c6 100644
--- a/engines/scumm/dialogs.h
+++ b/engines/scumm/dialogs.h
@@ -242,6 +242,9 @@ protected:
 	GUI::CheckboxWidget *createGammaCorrectionCheckbox(GuiObject *boss, const Common::String &name);
 	GUI::CheckboxWidget *createSegaShadowModeCheckbox(GuiObject *boss, const Common::String &name);
 	GUI::CheckboxWidget *createCopyProtectionCheckbox(GuiObject *boss, const Common::String &name);
+#ifdef USE_TTS
+	GUI::CheckboxWidget *createEnableTTSCheckbox(GuiObject *boss, const Common::String &name);
+#endif
 	void updateAdjustmentSlider(GUI::SliderWidget *slider, GUI::StaticTextWidget *value);
 
 	Common::Array<GUI::CheckboxWidget *> _enhancementsCheckboxes;
@@ -294,6 +297,9 @@ private:
 
 	GUI::CheckboxWidget *_enableOriginalGUICheckbox = nullptr;
 	GUI::CheckboxWidget *_enableCopyProtectionCheckbox = nullptr;
+#ifdef USE_TTS
+	GUI::CheckboxWidget *_enableTTSCheckbox = nullptr;
+#endif
 
 	GUI::SliderWidget *_overtureTicksSlider = nullptr;
 	GUI::StaticTextWidget *_overtureTicksValue = nullptr;
@@ -322,6 +328,9 @@ private:
 	GUI::CheckboxWidget *_enableOriginalGUICheckbox = nullptr;
 	GUI::CheckboxWidget *_enableGammaCorrectionCheckbox = nullptr;
 	GUI::CheckboxWidget *_enableCopyProtectionCheckbox = nullptr;
+#ifdef USE_TTS
+	GUI::CheckboxWidget *_enableTTSCheckbox = nullptr;
+#endif
 	GUI::SliderWidget *_sndQualitySlider = nullptr;
 	GUI::StaticTextWidget *_sndQualityValue = nullptr;
 	int _quality = 0;
@@ -347,6 +356,9 @@ private:
 	void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
 
 	GUI::CheckboxWidget *_enableOriginalGUICheckbox = nullptr;
+#ifdef USE_TTS
+	GUI::CheckboxWidget *_enableTTSCheckbox = nullptr;
+#endif
 
 	GUI::SliderWidget *_playbackAdjustmentSlider = nullptr;
 	GUI::StaticTextWidget *_playbackAdjustmentValue = nullptr;
@@ -376,6 +388,9 @@ private:
 
 	GUI::CheckboxWidget *_enableOriginalGUICheckbox = nullptr;
 	GUI::CheckboxWidget *_enableSegaShadowModeCheckbox = nullptr;
+#ifdef USE_TTS
+	GUI::CheckboxWidget *_enableTTSCheckbox = nullptr;
+#endif
 
 	GUI::SliderWidget *_introAdjustmentSlider = nullptr;
 	GUI::StaticTextWidget *_introAdjustmentValue = nullptr;
diff --git a/engines/scumm/gfx_gui.cpp b/engines/scumm/gfx_gui.cpp
index 739ffa5a211..713670be0ee 100644
--- a/engines/scumm/gfx_gui.cpp
+++ b/engines/scumm/gfx_gui.cpp
@@ -295,6 +295,9 @@ Common::KeyState ScummEngine::showBannerAndPause(int bannerId, int32 waitTime, c
 	// will stay on screen until an input has been received or until the time-out.
 	Common::KeyState ks = Common::KEYCODE_INVALID;
 	bool leftBtnPressed = false, rightBtnPressed = false;
+#ifdef USE_TTS
+	sayText(bannerMsg);
+#endif
 	if (waitTime) {
 		waitForBannerInput(waitTime, ks, leftBtnPressed, rightBtnPressed);
 		clearBanner();
@@ -534,6 +537,10 @@ Common::KeyState ScummEngine::showOldStyleBannerAndPause(const char *msg, int co
 		updateDirtyScreen(kBannerVirtScreen);
 	}
 
+#ifdef USE_TTS
+	sayText(bannerMsg);
+#endif
+
 	// Wait until the engine receives a new Keyboard or Mouse input,
 	// unless we have specified a positive waitTime: in that case, the banner
 	// will stay on screen until an input has been received or until the time-out.
@@ -1952,9 +1959,15 @@ void ScummEngine::drawDraftsInventory() {
 			// Draw the titles of the drafts...
 			if (draft & 0x2000) {
 				drawGUIText(names[i + 1], nullptr, xPos - textOffset, yConstant - 40 + textHeight * heightMultiplier, titleColor, false);
+#ifdef USE_TTS
+				sayText(names[i + 1]);
+#endif
 			} else {
 				// Draw "Unknown:" as the title of the draft
 				drawGUIText(names[17], nullptr, xPos - textOffset, yConstant - 40 + textHeight * heightMultiplier, titleColor, false);
+#ifdef USE_TTS
+				sayText(names[17]);
+#endif
 			}
 
 			notesWidth = getGUIStringWidth(notesBuf);
@@ -1978,6 +1991,9 @@ void ScummEngine::drawDraftsInventory() {
 			// Draw the notes of the draft... notice how we are subtracting
 			// notesWidth: we are forcing the text aligning on the left.
 			drawGUIText(notesBuf, nullptr, xPos - notesWidth + 127 + textOffset, yConstant - 40 + textHeight * heightMultiplier, notesColor, false);
+#ifdef USE_TTS
+			sayText(notesBuf);
+#endif
 		} else {
 			// Hebrew language, let's swap the layout!
 
@@ -1994,6 +2010,9 @@ void ScummEngine::drawDraftsInventory() {
 			// Draw the notes of the drafts...
 			drawGUIText(notesBuf, nullptr, xPos - textOffset, yConstant - 40 + textHeight * heightMultiplier, notesColor, false);
 			namesWidth = getGUIStringWidth(names[i + 1]);
+#ifdef USE_TTS
+			sayText(notesBuf);
+#endif
 
 			// Text position adjustments for the titles...
 			// (Objective: Leave three pixels to the right)
@@ -2007,10 +2026,16 @@ void ScummEngine::drawDraftsInventory() {
 			if (draft & 0x2000) {
 				namesWidth = getGUIStringWidth(names[i + 1]);
 				drawGUIText(names[i + 1], nullptr, xPos - namesWidth + 127 + textOffset, yConstant - 40 + textHeight * heightMultiplier, titleColor, false);
+#ifdef USE_TTS
+				sayText(names[i + 1]);
+#endif
 			} else {
 				// Draw "Unknown:" as the title of the draft
 				namesWidth = getGUIStringWidth(names[17]);
 				drawGUIText(names[17], nullptr, xPos - namesWidth + 127 + textOffset, yConstant - 40 + textHeight * heightMultiplier, titleColor, false);
+#ifdef USE_TTS
+				sayText(names[17]);
+#endif
 			}
 		}
 	}
@@ -4437,28 +4462,54 @@ void ScummEngine::updateMainMenuControls() {
 		if (_game.id == GID_FT) {
 			convertMessageToString((const byte *)getGUIString(gsSpooledMusic), (byte *)msg, sizeof(msg));
 			drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 19, textColor, false);
+#ifdef USE_TTS
+			_internalGUIControls[GUI_CTRL_SPOOLED_MUSIC_CHECKBOX].alternateTTSLabel = (const char *)msg;
+			_internalGUIControls[GUI_CTRL_SPOOLED_MUSIC_CHECKBOX].alternateTTSLabel += ": " + _internalGUIControls[GUI_CTRL_SPOOLED_MUSIC_CHECKBOX].label;
+#endif
 
 			convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
 			drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 33, textColor, false);
+#ifdef USE_TTS
+			_internalGUIControls[GUI_CTRL_MUSIC_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 			convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
 			drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 47, textColor, false);
+#ifdef USE_TTS
+			_internalGUIControls[GUI_CTRL_SFX_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 		} else {
 			convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
 			drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 25, textColor, false);
+#ifdef USE_TTS
+			_internalGUIControls[GUI_CTRL_MUSIC_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 			convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
 			drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 43, textColor, false);
+#ifdef USE_TTS
+			_internalGUIControls[GUI_CTRL_SPEECH_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 		}
 
 		convertMessageToString((const byte *)getGUIString(gsSfx), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 61, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_SFX_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsDisplayText), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 88, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].alternateTTSLabel = (const char *)msg;
+		_internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].alternateTTSLabel += ": " + _internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].label;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsTextSpeed), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 29, yCntr - calculatedHeight - yOffset + 102, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_TEXT_SPEED_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		drawLine(23, yCntr - calculatedHeight - yOffset + 77, 204, yCntr - calculatedHeight - yOffset + 77, getBannerColor(17));
 		drawLine(23, yCntr - calculatedHeight - yOffset + 78, 204, yCntr - calculatedHeight - yOffset + 78, getBannerColor(4));
@@ -4472,18 +4523,34 @@ void ScummEngine::updateMainMenuControls() {
 	} else {
 		convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 33, yConstantV6 - 36, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_MUSIC_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 33, yConstantV6 - 22, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_SPEECH_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsSfx), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 33, yConstantV6 - 8, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_SFX_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsDisplayText), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 33, yConstantV6 + 19, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].alternateTTSLabel = (const char *)msg;
+		_internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].alternateTTSLabel += ": " + _internalGUIControls[GUI_CTRL_DISPLAY_TEXT_CHECKBOX].label;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsTextSpeed), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, 33, yConstantV6 + 34, textColor, false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_TEXT_SPEED_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		drawLine(27, yConstantV6 + 8,  201, yConstantV6 + 8,  getBannerColor(17));
 		drawLine(27, yConstantV6 + 9,  201, yConstantV6 + 9,  getBannerColor(4));
@@ -4513,6 +4580,9 @@ void ScummEngine::updateMainMenuControlsSegaCD() {
 
 		convertMessageToString((const byte *)getGUIString(gsTextSpeed), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, isJap ? 118 : 167, yConstant, getBannerColor(2), false);
+#ifdef USE_TTS
+		_internalGUIControls[GUI_CTRL_TEXT_SPEED_SLIDER].alternateTTSLabel = (const char *)msg;
+#endif
 
 		convertMessageToString((const byte *)getGUIString(gsSlowFast), (byte *)msg, sizeof(msg));
 		drawGUIText(msg, nullptr, isJap ? 151 : 158, yConstant + 37, getBannerColor(2), false);
@@ -4596,6 +4666,9 @@ void ScummEngine::drawMainMenuTitle(const char *title) {
 		drawGUIText(title, nullptr, 160, yConstantV6 - 56, stringColor, true);
 	}
 
+#ifdef USE_TTS
+	sayText(title, Common::TextToSpeechManager::INTERRUPT);
+#endif
 	ScummEngine::drawDirtyScreenParts();
 	_system->updateScreen();
 }
diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp
index a75bcc32d1c..55af2d6d264 100644
--- a/engines/scumm/input.cpp
+++ b/engines/scumm/input.cpp
@@ -645,6 +645,10 @@ void ScummEngine::waitForBannerInput(int32 waitTime, Common::KeyState &ks, bool
 					   ks.keycode != Common::KEYCODE_RALT    &&
 					   !(ks.keycode == Common::KEYCODE_s && ks.hasFlags(Common::KBD_ALT));
 
+#ifdef USE_TTS
+			sayButtonText();
+#endif
+
 			if (validKey || leftBtnClicked || rightBtnClicked || (handleMouseWheel && _mouseWheelFlag))
 				return;
 
@@ -672,6 +676,10 @@ void ScummEngine::waitForBannerInput(int32 waitTime, Common::KeyState &ks, bool
 			leftBtnClicked = (_leftBtnPressed & msClicked) != 0;
 			rightBtnClicked = (_rightBtnPressed & msClicked) != 0;
 
+#ifdef USE_TTS
+			sayButtonText();
+#endif
+
 			if (shouldQuit())
 				return;
 
@@ -1003,6 +1011,9 @@ void ScummEngine::processKeyboard(Common::KeyState lastKeyHit) {
 				int8 oldCursorState = _cursor.state;
 				_cursor.state = (_game.id == GID_MONKEY && _game.platform == Common::kPlatformMacintosh) ? 1 : 0;
 				CursorMan.showMouse(_cursor.state > 0);
+#ifdef USE_TTS
+				stopTextToSpeech();
+#endif
 				// "Game Paused.  Press SPACE to Continue."
 				if (_game.version > 4)
 					showBannerAndPause(0, -1, getGUIString(gsPause));
diff --git a/engines/scumm/metaengine.cpp b/engines/scumm/metaengine.cpp
index d53d9ddf379..cdf47b14e43 100644
--- a/engines/scumm/metaengine.cpp
+++ b/engines/scumm/metaengine.cpp
@@ -858,6 +858,17 @@ static const ExtraGuiOption enableAmbienceSounds = {
 };
 #endif
 
+#ifdef USE_TTS
+static const ExtraGuiOption enableTTS = {
+	_s("Enable Text to Speech"),
+	_s("Use TTS to read text in the game (if TTS is available)"),
+	"tts_enabled",
+	false,
+	0,
+	0
+};
+#endif
+
 const ExtraGuiOptions ScummMetaEngine::getExtraGuiOptions(const Common::String &target) const {
 	ExtraGuiOptions options;
 	// Query the GUI options
@@ -894,6 +905,11 @@ const ExtraGuiOptions ScummMetaEngine::getExtraGuiOptions(const Common::String &
 			options.push_back(enableAmbienceSounds);
 #endif
 	}
+#ifdef USE_TTS
+	if (target.empty() || guiOptions.contains(GAMEOPTION_TTS)) {
+		options.push_back(enableTTS);
+	}
+#endif
 	if (target.empty() || gameid == "comi") {
 		options.push_back(comiObjectLabelsOption);
 
diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp
index 65fc6cf927e..e6a6109ebcc 100644
--- a/engines/scumm/room.cpp
+++ b/engines/scumm/room.cpp
@@ -154,6 +154,15 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) {
 	_currentRoom = room;
 	VAR(VAR_ROOM) = room;
 
+#ifdef USE_TTS
+	if (_game.id == GID_PASS && _roomResource == 2 && room != _roomResource) {
+		for (uint index = 0; index < ARRAYSIZE(_passHelpButtons); ++index) {
+			_passHelpButtons[index].clear();
+		}
+		_voicePassHelpButtons = false;
+	}
+#endif
+
 	if (room >= 0x80 && _game.version < 7 && _game.heversion <= 71)
 		_roomResource = _resourceMapper[room & 0x7F];
 	else
diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp
index dc73e3ed4a5..62df5793891 100644
--- a/engines/scumm/script.cpp
+++ b/engines/scumm/script.cpp
@@ -1478,10 +1478,17 @@ void ScummEngine::runInputScript(int clickArea, int val, int mode) {
 void ScummEngine::decreaseScriptDelay(int amount) {
 	ScriptSlot *ss = vm.slot;
 	int i;
+#ifdef USE_TTS
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+#endif
 	for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) {
 		if (ss->status == ssPaused) {
 			ss->delay -= amount;
+#ifdef USE_TTS
+			if (ss->delay < 0 && (!ttsMan || !ttsMan->isSpeaking())) {
+#else
 			if (ss->delay < 0) {
+#endif
 				if (_game.id == GID_INDY3 && _game.platform == Common::kPlatformMacintosh && ss->number == 134) {
 					// Unlike the DOS version, there doesn't
 					// appear to be anything in the credits
@@ -1651,6 +1658,9 @@ void ScummEngine::abortCutscene() {
 	uint32 offs = vm.cutScenePtr[idx];
 	if (offs) {
 		ScriptSlot *ss = &vm.slot[vm.cutSceneScript[idx]];
+#ifdef USE_TTS
+		stopTextToSpeech();
+#endif
 		ss->offs = offs;
 		ss->status = ssRunning;
 		ss->freezeCount = 0;
diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp
index f6dac08bb7f..babb930065f 100644
--- a/engines/scumm/script_v0.cpp
+++ b/engines/scumm/script_v0.cpp
@@ -480,6 +480,9 @@ void ScummEngine_v0::drawSentenceLine() {
 			}
 			_sentenceBuf += Common::String::format("%-13s", actorName);
 		}
+#ifdef USE_TTS
+		_voiceNextString = true;
+#endif
 		flushSentenceLine();
 		return;
 	}
@@ -490,6 +493,9 @@ void ScummEngine_v0::drawSentenceLine() {
 
 	char *verbName = (char *)getResourceAddress(rtVerb, _activeVerb);
 	assert(verbName);
+#ifdef USE_TTS
+	Common::String oldSentence = _sentenceBuf;
+#endif
 	_sentenceBuf = verbName;
 
 	if (_activeObject) {
@@ -507,6 +513,12 @@ void ScummEngine_v0::drawSentenceLine() {
 		}
 	}
 
+#ifdef USE_TTS
+	if (oldSentence != _sentenceBuf) {
+		_voiceNextString = true;
+	}
+#endif
+
 	flushSentenceLine();
 }
 
diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp
index af50bff5979..0ae8c03d1ea 100644
--- a/engines/scumm/script_v2.cpp
+++ b/engines/scumm/script_v2.cpp
@@ -830,6 +830,7 @@ void ScummEngine_v2::o2_verbOps() {
 	int verb = fetchScriptByte();
 	int slot, state;
 
+	Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::INTERRUPT;
 	switch (verb) {
 	case 0:		// SO_DELETE_VERBS
 		slot = getVarOrDirectByte(PARAM_1) + 1;
@@ -894,6 +895,13 @@ void ScummEngine_v2::o2_verbOps() {
 			vs->curRect.top = y;
 		}
 
+#ifdef USE_TTS
+		if (_game.id == GID_MANIAC && (_game.features & GF_DEMO)) {
+			ttsAction = Common::TextToSpeechManager::QUEUE;
+			_voiceNextString = true;
+		}
+#endif
+
 		// FIXME: these keyboard map depends on the language of the game.
 		// E.g. a german keyboard has 'z' and 'y' swapped, while a french
 		// keyboard starts with "azerty", etc.
@@ -922,7 +930,7 @@ void ScummEngine_v2::o2_verbOps() {
 	}
 
 	// Force redraw of the modified verb slot
-	drawVerb(slot, 0);
+	drawVerb(slot, 0, ttsAction);
 	verbMouseOver(0);
 }
 
diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp
index 2e1ba5fea05..599a2c6ae9a 100644
--- a/engines/scumm/script_v5.cpp
+++ b/engines/scumm/script_v5.cpp
@@ -3156,6 +3156,15 @@ void ScummEngine_v5::o5_verbOps() {
 			loadPtrToResource(rtVerb, slot, nullptr);
 			if (slot == 0)
 				_res->nukeResource(rtVerb, slot);
+
+#ifdef USE_TTS
+			if (verb == 100 && vs->curmode == 1) {	// Sentence verb
+				_voiceNextString = true;
+			} else {
+				_voiceNextString = false;
+			}
+#endif
+
 			vs->type = kTextVerbType;
 			vs->imgindex = 0;
 			break;
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 6799003225f..62b9d3fdf2a 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -1523,6 +1523,14 @@ Common::Error ScummEngine::init() {
 	if (!ConfMan.hasKey("talkspeed", _targetName))
 		setTalkSpeed(_defaultTextSpeed);
 
+#ifdef USE_TTS
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (ttsMan) {
+		ttsMan->enable(ConfMan.getBool("tts_enabled"));
+		ttsMan->setLanguage(ConfMan.get("language"));
+	}
+#endif
+
 	_setupIsComplete = true;
 
 	syncSoundSettings();
@@ -2895,6 +2903,28 @@ void ScummEngine::scummLoop(int delta) {
 	if (_talkDelay < 0)
 		_talkDelay = 0;
 
+#ifdef USE_TTS
+	if (_game.id == GID_PASS && _roomResource == 2) {
+		int obj = findObject(_mouse.x, _mouse.y);
+		if (obj != 0) {
+			int adjustedObj = obj - 956;
+			if (adjustedObj >= 0 && adjustedObj < ARRAYSIZE(_passHelpButtons) && _previousSaid != _passHelpButtons[adjustedObj]) {
+				if (_voicePassHelpButtons) {
+					sayText(_passHelpButtons[adjustedObj], Common::TextToSpeechManager::INTERRUPT);
+				}
+				
+				_previousSaid = _passHelpButtons[adjustedObj];
+			}
+		} else {
+			_previousSaid.clear();
+		}
+
+		if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
+			stopTextToSpeech();
+		}
+	}
+#endif
+
 	// Record the current ego actor before any scripts (including input scripts)
 	// get a chance to run.
 	int oldEgo = 0;
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 0d280d8713a..2e6ed1d4ac5 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -35,6 +35,7 @@
 #include "common/rendermode.h"
 #include "common/str.h"
 #include "common/textconsole.h"
+#include "common/text-to-speech.h"
 #include "graphics/surface.h"
 #include "graphics/sjis.h"
 #include "graphics/palette.h"
@@ -476,6 +477,9 @@ struct InternalGUIControl {
 	int highlightedFillColor;
 	bool centerText;
 	Common::String label;
+#ifdef USE_TTS
+	Common::String alternateTTSLabel;
+#endif
 	bool doubleLinesFlag;
 };
 
@@ -1219,7 +1223,7 @@ protected:
 
 	void verbMouseOver(int verb);
 	int findVerbAtPos(int x, int y) const;
-	virtual void drawVerb(int verb, int mode);
+	virtual void drawVerb(int verb, int mode, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::INTERRUPT);
 	virtual void runInputScript(int clickArea, int val, int mode);
 	void restoreVerbBG(int verb);
 	void drawVerbBitmap(int verb, int x, int y);
@@ -1627,6 +1631,16 @@ protected:
 
 	Localizer *_localizer = nullptr;
 
+#ifdef USE_TTS
+	bool _voiceNextString = false;
+	bool _checkPreviousSaid = false;
+	bool _voicePassHelpButtons = false;
+	int _previousVerb = -1;
+	int _previousControl = -1;
+	Common::String _previousSaid;
+	Common::String _passHelpButtons[6];
+#endif
+
 	void restoreCharsetBg();
 	void clearCharsetMask();
 	void clearTextSurface();
@@ -1640,11 +1654,17 @@ protected:
 	virtual void displayDialog();
 	int countNumberOfWaits(); // For SE speech support, from disasm
 	bool newLine();
-	void drawString(int a, const byte *msg);
+	void drawString(int a, const byte *msg, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::QUEUE);
 	virtual void fakeBidiString(byte *ltext, bool ignoreVerb, int ltextSize) const;
 	void wrapSegaCDText();
 	void debugMessage(const byte *msg);
 	virtual void showMessageDialog(const byte *msg);
+	
+#ifdef USE_TTS
+	void sayText(const Common::String &text, Common::TextToSpeechManager::Action action = Common::TextToSpeechManager::QUEUE) const;
+	void stopTextToSpeech() const;
+	void sayButtonText();
+#endif
 
 	virtual int convertMessageToString(const byte *msg, byte *dst, int dstSize);
 	int convertIntMessage(byte *dst, int dstSize, int var);
diff --git a/engines/scumm/scumm_v7.h b/engines/scumm/scumm_v7.h
index 50b4cf5fbc4..aa56a411a1e 100644
--- a/engines/scumm/scumm_v7.h
+++ b/engines/scumm/scumm_v7.h
@@ -136,7 +136,7 @@ protected:
 	int getObjectIdFromOBIM(const byte *obim) override;
 
 	void createTextRenderer(GlyphRenderer_v7 *gr) override;
-	void enqueueText(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags);
+	void enqueueText(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags, bool ttsVoiceText = true, bool ttsIsSubtitle = false);
 	void drawTextImmediately(const byte *text, Common::Rect *clipRect, int x, int y, byte color, byte charset, TextStyleFlags flags);
 	void drawBlastTexts() override;
 	void showMessageDialog(const byte *msg) override;
@@ -166,7 +166,7 @@ protected:
 	void setCursorTransparency(int a) override;
 	void setCursorFromImg(uint img, uint room, uint imgindex) override;
 
-	void drawVerb(int verb, int mode) override;
+	void drawVerb(int verb, int mode, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::INTERRUPT) override;
 
 	void pauseEngineIntern(bool pause) override;
 
@@ -175,10 +175,18 @@ protected:
 	struct BlastText : TextObject {
 		Common::Rect rect;
 		TextStyleFlags flags;
+#ifdef USE_TTS
+		bool voiceText;
+		bool isSubtitle;
+#endif
 
 		void clear() {
 			this->TextObject::clear();
 			rect = Common::Rect();
+#ifdef USE_TTS
+			voiceText = true;
+			isSubtitle = false;
+#endif
 		}
 	};
 
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index 6967a103621..5b5cbdd4283 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -426,7 +426,12 @@ void Sound::processSfxQueues() {
 #endif
 		}
 
+#ifdef USE_TTS
+		Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+		if (finished && (!ConfMan.getBool("subtitles") || _vm->_talkDelay == 0) && (!ttsMan || !ttsMan->isSpeaking())) {
+#else
 		if (finished && (!ConfMan.getBool("subtitles") || _vm->_talkDelay == 0)) {
+#endif
 			if (!(_vm->_game.version == 8 && _vm->VAR(_vm->VAR_HAVE_MSG) == 0))
 				_vm->stopTalk();
 		}
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index 66da9def51b..ebb998ecca0 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -107,6 +107,9 @@ void ScummEngine::printString(int m, const byte *msg) {
 		actorTalk(msg);
 		break;
 	case 1:
+#ifdef USE_TTS
+		_voiceNextString = true;
+#endif
 		drawString(1, msg);
 		break;
 	case 2:
@@ -168,6 +171,78 @@ void ScummEngine::showMessageDialog(const byte *msg) {
 
 }
 
+#ifdef USE_TTS
+
+void ScummEngine::sayText(const Common::String &text, Common::TextToSpeechManager::Action action) const {
+	if (text.empty()) {
+		return;
+	}
+
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (ttsMan && ConfMan.getBool("tts_enabled")) {
+		// Some games, like Loom, may display strings of only characters (such as underscores) that make for awkward voicing.
+		// Before voicing text, make sure it has either an alphanumeric character or a non-ASCII character (for languages
+		// like Russian or Hebrew that may only have non-ASCII characters)
+		for (uint i = 0; i < text.size(); ++i) {
+			if (Common::isAlnum(text[i]) || !Common::isAscii(text[i])) {
+				Common::String ttsMessage = text;
+				ttsMessage.replace('^', ' ');
+
+				Common::String copyrightReplacement;
+				Common::String toReplace = "=";
+
+				switch (getDialogCodePage()) {
+				case Common::kDos850:
+					copyrightReplacement = "\xb8";
+					break;
+				case Common::kWindows1252:
+				case Common::kWindows1255:
+					copyrightReplacement = "\xa9";
+					break;
+				default:
+					// Replace what would be the copyright symbol with a space for encodings that don't have it
+					copyrightReplacement = "\x20";
+					break;
+				}
+
+				// Loom uses a unique code for the copyright symbol, which also seems to include the 1 that comes after it
+				if (_game.id == GID_LOOM) {
+					toReplace = "\x3e\x2a";
+					copyrightReplacement += " 1";
+				}
+
+				Common::replace(ttsMessage, toReplace, copyrightReplacement);
+				Common::replace(ttsMessage, "\x1c", copyrightReplacement);
+
+				ttsMan->say(_charset->convertText(ttsMessage, _language), action);
+				return;
+			}
+		}
+	}
+}
+
+void ScummEngine::stopTextToSpeech() const {
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (ttsMan && ConfMan.getBool("tts_enabled") && ttsMan->isSpeaking()) {
+		ttsMan->stop();
+	}
+}
+
+void ScummEngine::sayButtonText() {
+	int hoveredControl = getInternalGUIControlFromCoordinates(_mouse.x, _mouse.y);
+	if (hoveredControl != -1 && _previousControl != hoveredControl) {
+		if (!_internalGUIControls[hoveredControl].alternateTTSLabel.empty()) {
+			sayText(_internalGUIControls[hoveredControl].alternateTTSLabel, Common::TextToSpeechManager::INTERRUPT);
+		} else {
+			sayText(_internalGUIControls[hoveredControl].label, Common::TextToSpeechManager::INTERRUPT);
+		}
+	}
+
+	_previousControl = hoveredControl;
+}
+
+#endif
+
 #pragma mark -
 #pragma mark --- Core message/subtitle code ---
 #pragma mark -
@@ -909,6 +984,9 @@ void ScummEngine_v2::drawSentence() {
 	}
 
 	byte string[80];
+#ifdef USE_TTS
+	Common::String oldSentence = _sentenceBuf;
+#endif
 	const char *ptr = _sentenceBuf.c_str();
 	int i = 0, len = 0;
 
@@ -943,6 +1021,12 @@ void ScummEngine_v2::drawSentence() {
 	}
 	restoreBackground(sentenceline);
 
+#ifdef USE_TTS
+	if (oldSentence != _sentenceBuf) {
+		_voiceNextString = true;
+	}
+#endif
+
 	drawString(2, (byte *)string);
 }
 
@@ -1025,7 +1109,12 @@ void ScummEngine::displayDialog() {
 		memcpy(&_charset->_str, &_curStringRect, sizeof(Common::Rect));
 #endif
 
+#ifdef USE_TTS
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (_talkDelay || (ttsMan && ttsMan->isSpeaking()))
+#else
 	if (_talkDelay)
+#endif
 		return;
 
 	if ((_game.version <= 6 && _haveMsg == 1) ||
@@ -1129,6 +1218,9 @@ void ScummEngine::displayDialog() {
 	bool createTextBox = (_macGui && _game.id == GID_INDY3);
 	bool drawTextBox = false;
 
+#ifdef USE_TTS
+	Common::String ttsMessage;
+#endif
 	while (handleNextCharsetCode(a, &c)) {
 		if (c == 0) {
 			// End of text reached, set _haveMsg accordingly
@@ -1139,6 +1231,9 @@ void ScummEngine::displayDialog() {
 		}
 
 		if (c == 13) {
+#ifdef USE_TTS
+			ttsMessage += ' ';
+#endif
 			if (!newLine())
 				break;
 			continue;
@@ -1187,6 +1282,9 @@ void ScummEngine::displayDialog() {
 		if (_game.version <= 3) {
 			_charset->printChar(c, false);
 			_msgCount += 1;
+#ifdef USE_TTS
+			ttsMessage += c;
+#endif
 		} else {
 			if (_game.features & GF_16BIT_COLOR) {
 				// HE games which use sprites for subtitles
@@ -1199,6 +1297,9 @@ void ScummEngine::displayDialog() {
 				// of this message -> don't print it.
 			} else {
 				_charset->printChar(c, false);
+#ifdef USE_TTS
+				ttsMessage += c;
+#endif
 			}
 		}
 		_nextLeft = _charset->_left;
@@ -1212,6 +1313,14 @@ void ScummEngine::displayDialog() {
 		}
 	}
 
+#ifdef USE_TTS
+	if (!_mixer->isSoundHandleActive(*_sound->_talkChannelHandle) && 
+		(_game.heversion < 60 || !_sound->isSoundInUse(HSND_TALKIE_SLOT)) && 
+		!_sound->pollCD()) {
+		sayText(ttsMessage, Common::TextToSpeechManager::INTERRUPT);
+	}
+#endif
+
 	if (drawTextBox)
 		mac_drawIndy3TextBox();
 
@@ -1242,7 +1351,7 @@ int ScummEngine::countNumberOfWaits() {
 	return numWaits;
 }
 
-void ScummEngine::drawString(int a, const byte *msg) {
+void ScummEngine::drawString(int a, const byte *msg, Common::TextToSpeechManager::Action ttsAction) {
 	byte buf[270];
 	byte *space;
 	int i, c;
@@ -1267,6 +1376,49 @@ void ScummEngine::drawString(int a, const byte *msg) {
 	_charset->_disableOffsX = _charset->_firstChar = true;
 	_charset->setCurID(_string[a].charset);
 
+#ifdef USE_TTS
+	bool bypassTalkDelay = false;
+
+	// Help menu, which uses objects for buttons
+	if (_game.id == GID_PASS && _roomResource == 2) {
+		for (uint8 index = 0; index < ARRAYSIZE(_passHelpButtons); ++index) {
+			if (_passHelpButtons[index].empty()) {
+				_voiceNextString = false;
+				int obj = findObject(_charset->_left, _charset->_top);
+
+				if (obj != 0) {
+					int adjustedObj = obj - 956;
+					if (adjustedObj >= 0 && adjustedObj < ARRAYSIZE(_passHelpButtons)) {
+						_passHelpButtons[adjustedObj] = (const char *)buf;
+					}
+				}
+				break;
+			}
+		}
+
+		if (_voiceNextString) {
+			bypassTalkDelay = true;
+		}
+	}
+
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (_voiceNextString && (getTalkingActor() == 0xFF || getTalkingActor() == 0) && 
+		(!_talkDelay || bypassTalkDelay || (ttsMan && !ttsMan->isSpeaking()) || ttsAction == Common::TextToSpeechManager::QUEUE)) {
+		const char *message = (const char *)buf;
+		if (!_checkPreviousSaid || scumm_stricmp(message, _previousSaid.c_str()) != 0) {
+			sayText(message, ttsAction);
+
+			if (!bypassTalkDelay) {
+				_previousSaid = message;
+			}
+		}
+
+		_voicePassHelpButtons = true;
+		_checkPreviousSaid = false;
+		_voiceNextString = false;
+	}
+#endif
+
 	VirtScreen *vs = findVirtScreen(_charset->_top);
 	bool shadowModeFlag = (vs && vs->number == kMainVirtScreen);
 
diff --git a/engines/scumm/string_v7.cpp b/engines/scumm/string_v7.cpp
index 6b6ac4199f0..9088be0728d 100644
--- a/engines/scumm/string_v7.cpp
+++ b/engines/scumm/string_v7.cpp
@@ -412,7 +412,7 @@ void ScummEngine_v7::createTextRenderer(GlyphRenderer_v7 *gr) {
 #pragma mark --- V7 blast text queue code ---
 #pragma mark -
 
-void ScummEngine_v7::enqueueText(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags) {
+void ScummEngine_v7::enqueueText(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags, bool ttsVoiceText, bool ttsIsSubtitle) {
 	assert(_blastTextQueuePos + 1 <= ARRAYSIZE(_blastTextQueue));
 
 	if (_useCJKMode) {
@@ -427,8 +427,14 @@ void ScummEngine_v7::enqueueText(const byte *text, int x, int y, byte color, byt
 	convertMessageToString(text, bt.text, sizeof(bt.text));
 
 	// The original DIG interpreter expressly checks for " " strings here. And the game also sends these quite frequently...
-	if (!bt.text[0] || (bt.text[0] == (byte)' ' && !bt.text[1]))
+	if (!bt.text[0] || (bt.text[0] == (byte)' ' && !bt.text[1])) {
+#ifdef USE_TTS
+		if (getTalkingActor() == 0xFF || getTalkingActor() == 0) {
+			_previousSaid.clear();
+		}
+#endif
 		return;
+	}
 
 	_blastTextQueuePos++;
 	bt.xpos = x;
@@ -436,6 +442,10 @@ void ScummEngine_v7::enqueueText(const byte *text, int x, int y, byte color, byt
 	bt.color = color;
 	bt.charset = charset;
 	bt.flags = flags;
+#ifdef USE_TTS
+	bt.voiceText = ttsVoiceText;
+	bt.isSubtitle = ttsIsSubtitle;
+#endif
 }
 
 void ScummEngine_v7::drawTextImmediately(const byte *text, Common::Rect *clipRect, int x, int y, byte color, byte charset, TextStyleFlags flags) {
@@ -461,6 +471,10 @@ void ScummEngine_v7::drawTextImmediately(const byte *text, Common::Rect *clipRec
 void ScummEngine_v7::drawBlastTexts() {
 	VirtScreen *vs = &_virtscr[kMainVirtScreen];
 
+#ifdef USE_TTS
+	Common::String ttsMessage;
+	Common::String ttsSubtitles;
+#endif
 	for (int i = 0; i < _blastTextQueuePos; i++) {
 		BlastText &bt = _blastTextQueue[i];
 
@@ -486,15 +500,49 @@ void ScummEngine_v7::drawBlastTexts() {
 			}
 
 			_textV7->drawStringWrap((const char*)bt.text, (byte*)vs->getPixels(0, _screenTop), bt.rect, bt.xpos, bt.ypos, vs->pitch, bt.color, bt.flags);
+#ifdef USE_TTS
+			if (bt.voiceText) {
+				if (bt.isSubtitle) {
+					ttsSubtitles += " ";
+					ttsSubtitles += (const char *)bt.text;
+				} else {
+					ttsMessage += " ";
+					ttsMessage += (const char *)bt.text;
+				}
+			}
+#endif
 		} else {
 			bt.rect = _defaultTextClipRect;
 			_textV7->drawString((const char*)bt.text, (byte*)vs->getPixels(0, _screenTop), bt.rect, bt.xpos, bt.ypos, vs->pitch, bt.color, bt.flags);
+			
+#ifdef USE_TTS
+			if (bt.voiceText) {
+				if (bt.isSubtitle) {
+					ttsSubtitles += " ";
+					ttsSubtitles += (const char *)bt.text;
+				} else {
+					ttsMessage += " ";
+					ttsMessage += (const char *)bt.text;
+				}
+			}
+#endif
 		}
 
 		bt.rect.top += _screenTop;
 		bt.rect.bottom += _screenTop;
 		markRectAsDirty(vs->number, bt.rect);
 	}
+
+#ifdef USE_TTS
+	if (!ttsSubtitles.empty()) {
+		ttsMessage = ttsSubtitles;
+	}
+
+	if (_previousSaid != ttsMessage) {
+		sayText(ttsMessage, Common::TextToSpeechManager::INTERRUPT);
+		_previousSaid = ttsMessage;
+	}
+#endif
 }
 
 void ScummEngine_v7::removeBlastTexts() {
@@ -565,13 +613,13 @@ void ScummEngine_v7::processSubtitleQueue() {
 			continue;
 		if (usingOldSystem) {
 			if (st->center || VAR(VAR_VOICE_MODE)) {
-				enqueueText(st->text, st->xpos, st->ypos, st->color, st->charset, (TextStyleFlags)0);
+				enqueueText(st->text, st->xpos, st->ypos, st->color, st->charset, (TextStyleFlags)0, (st->actorSpeechMsg || ConfMan.getBool("speech_mute") || VAR(VAR_VOICE_MODE) == 2), true);
 			}
 		} else {
 			int flags = st->wrap ? kStyleWordWrap : 0;
 			if (st->center)
 				flags |= kStyleAlignCenter;
-			enqueueText(st->text, st->xpos, st->ypos, st->color, st->charset, (TextStyleFlags)flags);
+			enqueueText(st->text, st->xpos, st->ypos, st->color, st->charset, (TextStyleFlags)flags, (st->actorSpeechMsg || ConfMan.getBool("speech_mute") || VAR(VAR_VOICE_MODE) == 2), true);
 		}
 	}
 }
@@ -662,7 +710,12 @@ void ScummEngine_v7::displayDialog() {
 		_charset->setCurID(_string[0].charset);
 	}
 
+#ifdef USE_TTS
+	Common::TextToSpeechManager *ttsMan = g_system->getTextToSpeechManager();
+	if (_talkDelay || (ttsMan && ttsMan->isSpeaking()))
+#else
 	if (_talkDelay)
+#endif
 		return;
 
 	if ((!usingOldSystem && VAR(VAR_HAVE_MSG)) || (usingOldSystem && _haveMsg != 1)) {
diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp
index 5855cb32949..1637dd33c0e 100644
--- a/engines/scumm/verbs.cpp
+++ b/engines/scumm/verbs.cpp
@@ -116,6 +116,19 @@ void ScummEngine_v0::verbDemoMode() {
 	for (i = 0; i < 6; i++) {
 		verbDrawDemoString(i);
 	}
+
+#ifdef USE_TTS
+	Common::String ttsMessage;
+	for (i = 0; i < 6; i++) {
+		ttsMessage += v0DemoStr[i].str;
+		ttsMessage += "\n";
+	}
+
+	if (_previousSaid != ttsMessage) {
+		sayText(ttsMessage);
+		_previousSaid = ttsMessage;
+	}
+#endif
 }
 
 void ScummEngine_v0::verbDrawDemoString(int VerbDemoNumber) {
@@ -528,8 +541,15 @@ void ScummEngine::handleMouseOver(bool updateInventory) {
 	if (_completeScreenRedraw) {
 		verbMouseOver(0);
 	} else {
-		if (_cursor.state > 0)
-			verbMouseOver(findVerbAtPos(_mouse.x, _mouse.y));
+		if (_cursor.state > 0) {
+			int verb = findVerbAtPos(_mouse.x, _mouse.y);
+			verbMouseOver(verb);
+#ifdef USE_TTS
+			if (verb == 0) {
+				_previousVerb = 0;
+			}
+#endif
+		}
 	}
 }
 
@@ -1012,7 +1032,7 @@ int ScummEngine::findVerbAtPos(int x, int y) const {
 }
 
 #ifdef ENABLE_SCUMM_7_8
-void ScummEngine_v7::drawVerb(int verb, int mode) {
+void ScummEngine_v7::drawVerb(int verb, int mode, Common::TextToSpeechManager::Action ttsAction) {
 	VerbSlot *vs;
 
 	if (!verb)
@@ -1088,7 +1108,7 @@ void ScummEngine_v7::drawVerb(int verb, int mode) {
 			vs->curRect.right = vs->curRect.left + finalWidth;
 			vs->curRect.bottom += _verbLineSpacing;
 		} else {
-			enqueueText(msg, xpos, ypos, color, vs->charset_nr, flags);
+			enqueueText(msg, xpos, ypos, color, vs->charset_nr, flags, color == vs->hicolor);
 		}
 
 		vs->oldRect = vs->curRect;
@@ -1098,7 +1118,7 @@ void ScummEngine_v7::drawVerb(int verb, int mode) {
 }
 #endif
 
-void ScummEngine::drawVerb(int verb, int mode) {
+void ScummEngine::drawVerb(int verb, int mode, Common::TextToSpeechManager::Action ttsAction) {
 	VerbSlot *vs;
 	bool tmp;
 	int pixelYOffset = (_game.platform == Common::kPlatformC64) ? (_game.id == GID_ZAK ? 2 : 1) : 0;
@@ -1144,8 +1164,21 @@ void ScummEngine::drawVerb(int verb, int mode) {
 		if (!msg)
 			return;
 
+#ifdef USE_TTS
+		// If _voiceNextString is true at this point, it's not a typical selected verb that's filtered with _previousVerb,
+		// so use the previously said text instead
+		if (_voiceNextString) {
+			_checkPreviousSaid = true;
+		}
+
+		if (_string[4].color == vs->hicolor && _previousVerb != verb) {
+			_voiceNextString = true;
+			_previousVerb = verb;
+		}
+#endif
+
 		tmp = _charset->_center;
-		drawString(4, msg);
+		drawString(4, msg, ttsAction);
 		_charset->_center = tmp;
 
 		if (isRtl)




More information about the Scummvm-git-logs mailing list