[Scummvm-git-logs] scummvm master -> 697c6e4a722cefa7a9067ea1d4ab9f667e5fef78
mgerhardy
noreply at scummvm.org
Mon Mar 27 07:24:15 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
697c6e4a72 TWINE: Little big adventure can't mix language between voice and text #14261
Commit: 697c6e4a722cefa7a9067ea1d4ab9f667e5fef78
https://github.com/scummvm/scummvm/commit/697c6e4a722cefa7a9067ea1d4ab9f667e5fef78
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-03-27T06:22:26+02:00
Commit Message:
TWINE: Little big adventure can't mix language between voice and text #14261
this is now possible with a new in-game option
Changed paths:
engines/twine/menu/menu.cpp
engines/twine/menu/menu.h
engines/twine/metaengine.cpp
engines/twine/movies.cpp
engines/twine/parser/text.cpp
engines/twine/resources/resources.cpp
engines/twine/shared.h
engines/twine/text.cpp
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 9ee1e035358..82d92e3b554 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -67,7 +67,8 @@ enum MenuButtonTypesEnum {
kShadowSettings = 7,
kSceneryZoom = 8,
kHighResolution = 9,
- kWallCollision = 10
+ kWallCollision = 10,
+ kVoice = 11
};
}
@@ -123,11 +124,19 @@ static MenuSettings createGiveUpSaveMenu() {
return settings;
}
+static MenuSettings createLanguageMenu(bool lba1) {
+ MenuSettings settings;
+ settings.addButton(TextId::kReturnMenu);
+ settings.addButton(TextId::kCustomVoicesEnglish, MenuButtonTypes::kVoice);
+ return settings;
+}
+
static MenuSettings createOptionsMenu(bool lba1) {
MenuSettings settings;
settings.addButton(TextId::kReturnMenu);
settings.addButton(TextId::kVolumeSettings);
settings.addButton(TextId::kSaveManage);
+ settings.addButton(TextId::kCustomLanguageOption);
settings.addButton(TextId::kAdvanced);
return settings;
}
@@ -183,6 +192,7 @@ Menu::Menu(TwinEEngine *engine) {
_engine = engine;
_optionsMenuState = _priv::createOptionsMenu(engine->isLBA1());
+ _languageMenuState = _priv::createLanguageMenu(engine->isLBA1());
_giveUpMenuWithSaveState = _priv::createGiveUpSaveMenu();
_volumeMenuState = _priv::createVolumeMenu();
_saveManageMenuState = _priv::createSaveManageMenu();
@@ -396,6 +406,17 @@ int16 Menu::drawButtons(MenuSettings *menuSettings, bool hover) {
default:
break;
}
+ } else if (menuSettings == &_languageMenuState) {
+ int16 id = menuSettings->getButtonState(i);
+ switch (id) {
+ case MenuButtonTypes::kVoice: {
+ const int voiceLanguage = ConfMan.getInt("audio_language");
+ menuSettings->setButtonTextId(i, (TextId)((int)TextId::kCustomVoicesNone - voiceLanguage));
+ break;
+ }
+ default:
+ break;
+ }
}
const int32 menuItemId = menuSettings->getButtonState(i);
const char *text = menuSettings->getButtonText(_engine->_text, i);
@@ -522,6 +543,28 @@ int32 Menu::processMenu(MenuSettings *menuSettings) {
default:
break;
}
+ } else if (menuSettings == &_languageMenuState) {
+ switch (id) {
+ case MenuButtonTypes::kVoice:
+ if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft)) {
+ int voiceLanguage = ConfMan.getInt("audio_language");
+ --voiceLanguage;
+ if (voiceLanguage < 0) {
+ voiceLanguage = 3;
+ }
+ ConfMan.setInt("audio_language", voiceLanguage);
+ } else if (_engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
+ int voiceLanguage = ConfMan.getInt("audio_language");
+ ++voiceLanguage;
+ if (voiceLanguage > 3) {
+ voiceLanguage = 0;
+ }
+ ConfMan.setInt("audio_language", voiceLanguage);
+ }
+ break;
+ default:
+ break;
+ }
} else if (menuSettings == &_volumeMenuState) {
Audio::Mixer *mixer = _engine->_system->getMixer();
switch (id) {
@@ -714,6 +757,26 @@ int32 Menu::volumeMenu() {
return 0;
}
+int32 Menu::languageMenu() {
+ _engine->restoreFrontBuffer();
+
+ ScopedCursor scoped(_engine);
+ for (;;) {
+ switch (processMenu(&_languageMenuState)) {
+ case (int32)TextId::kReturnMenu:
+ return 0;
+ case kQuitEngine:
+ return kQuitEngine;
+ case (int32)MenuButtonTypes::kVoice:
+ default:
+ warning("Unknown menu button handled");
+ break;
+ }
+ }
+
+ return 0;
+}
+
void Menu::inGameOptionsMenu() {
_engine->_text->initDial(TextBankId::Options_and_menus);
_optionsMenuState.setButtonTextId(0, TextId::kReturnGame);
@@ -739,6 +802,9 @@ int32 Menu::optionsMenu() {
case (int32)TextId::kVolumeSettings: {
checkMenuQuit(volumeMenu()) break;
}
+ case (int32)TextId::kCustomLanguageOption: {
+ checkMenuQuit(languageMenu()) break;
+ }
case (int32)TextId::kSaveManage: {
checkMenuQuit(savemanageMenu()) break;
}
diff --git a/engines/twine/menu/menu.h b/engines/twine/menu/menu.h
index 5decc8e368f..e9809a0fec0 100644
--- a/engines/twine/menu/menu.h
+++ b/engines/twine/menu/menu.h
@@ -156,6 +156,7 @@ private:
MenuSettings _newGameMenuState;
MenuSettings _advOptionsMenuState;
MenuSettings _optionsMenuState;
+ MenuSettings _languageMenuState;
// objectRotation
int16 _itemAngle[NUM_INVENTORY_ITEMS];
@@ -180,6 +181,7 @@ private:
int32 advoptionsMenu();
/** Used to run the volume menu */
int32 volumeMenu();
+ int32 languageMenu();
/** Used to run the save game management menu */
int32 savemanageMenu();
void drawInfoMenu(int16 left, int16 top, int16 width);
diff --git a/engines/twine/metaengine.cpp b/engines/twine/metaengine.cpp
index 7578bbf8f7a..a987274f14c 100644
--- a/engines/twine/metaengine.cpp
+++ b/engines/twine/metaengine.cpp
@@ -94,23 +94,12 @@ static const ADExtraGuiOptionsMap twineOptionsList[] = {
0
}
},
- {
- GAMEOPTION_VOICES,
- {
- _s("Enable voices"),
- _s("Enable the voices for the game"),
- "voice",
- true,
- 0,
- 0
- }
- },
{
GAMEOPTION_TEXT,
{
_s("Enable text"),
_s("Enable the text for the game"),
- "displaytext",
+ "subtitles",
true,
0,
0
diff --git a/engines/twine/movies.cpp b/engines/twine/movies.cpp
index e3b7d9897f2..a807b5e62bf 100644
--- a/engines/twine/movies.cpp
+++ b/engines/twine/movies.cpp
@@ -480,7 +480,7 @@ bool Movies::playSmkMovie(const char *name, int index) {
decoder.start();
decoder.setAudioTrack(0); // music
- if (_engine->_cfgfile.Voice) {
+ if (ConfMan.getInt("audio_language") > 0) {
int additionalAudioTrack = -1;
if (!scumm_strnicmp(name, "INTRO", 5)) {
switch (_engine->getGameLang()) {
diff --git a/engines/twine/parser/text.cpp b/engines/twine/parser/text.cpp
index 7db288402ca..b0f556ce211 100644
--- a/engines/twine/parser/text.cpp
+++ b/engines/twine/parser/text.cpp
@@ -35,6 +35,11 @@ void TextData::initCustomTexts(TextBankId textBankId) {
add(textBankId, TextEntry{_c("High resolution off", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomHighResOptionOff});
add(textBankId, TextEntry{_c("Wall collision on", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomWallCollisionOn});
add(textBankId, TextEntry{_c("Wall collision off", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomWallCollisionOff});
+ add(textBankId, TextEntry{_c("Language selection", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomLanguageOption});
+ add(textBankId, TextEntry{_c("Voices: None", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomVoicesNone});
+ add(textBankId, TextEntry{_c("Voices: English", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomVoicesEnglish});
+ add(textBankId, TextEntry{_c("Voices: French", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomVoicesFrench});
+ add(textBankId, TextEntry{_c("Voices: German", "Options menu").encode(Common::CodePage::kDos850), -1, TextId::kCustomVoicesGerman});
}
}
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index 49708515f62..aeac2fa4d26 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -195,7 +195,7 @@ void Resources::initResources() {
const int32 textEntryCount = _engine->isLBA1() ? 28 : 30;
for (int32 i = 0; i < textEntryCount / 2; ++i) {
- if (!_textData.loadFromHQR(Resources::HQR_TEXT_FILE, (TextBankId)i, _engine->_cfgfile.LanguageId, _engine->isLBA1(), textEntryCount)) {
+ if (!_textData.loadFromHQR(Resources::HQR_TEXT_FILE, (TextBankId)i, _engine->_cfgfile._languageId, _engine->isLBA1(), textEntryCount)) {
error("HQR ERROR: Parsing textbank %i failed", i);
}
}
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 8fed0ee0061..32ac74445fa 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -586,6 +586,11 @@ enum class TextId : int16 {
kCustomHighResOptionOff = -3,
kCustomWallCollisionOn = -4,
kCustomWallCollisionOff = -5,
+ kCustomLanguageOption = -6,
+ kCustomVoicesNone = -7,
+ kCustomVoicesEnglish = -8,
+ kCustomVoicesFrench = -9,
+ kCustomVoicesGerman = -10,
// ------ lba2
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index e3300a4fa7f..2c1316b39bd 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -77,11 +77,20 @@ void Text::initVoxBank(TextBankId bankIdx) {
if ((int)bankIdx < 0 || (int)bankIdx >= ARRAYSIZE(LanguageSuffixTypes)) {
error("bankIdx is out of bounds: %i", (int)bankIdx);
}
- // get the correct vox hqr file
- _currentVoxBankFile = Common::String::format("%s%s" VOX_EXT, LanguageTypes[_engine->_cfgfile.LanguageId].id, LanguageSuffixTypes[(int)bankIdx]);
- _currentOggBaseFile = Common::String::format("%s%s_", LanguageTypes[_engine->_cfgfile.LanguageId].id, LanguageSuffixTypes[(int)bankIdx]);
- // TODO: loop through other languages and take the scummvm settings regarding voices into account...
-
+ // get the correct vox hqr file - english is the default
+ _currentVoxBankFile = Common::String::format("%s%s" VOX_EXT, LanguageTypes[0].id, LanguageSuffixTypes[(int)bankIdx]);
+ _currentOggBaseFile = Common::String::format("%s%s_", LanguageTypes[0].id, LanguageSuffixTypes[(int)bankIdx]);
+
+ const int voice = ConfMan.getInt("audio_language");
+ const int32 length = ARRAYSIZE(LanguageTypes);
+ for (int32 i = 0; i < length; i++) {
+ if (LanguageTypes[i].voice == voice) {
+ _currentVoxBankFile = Common::String::format("%s%s" VOX_EXT, LanguageTypes[i].id, LanguageSuffixTypes[(int)bankIdx]);
+ _currentOggBaseFile = Common::String::format("%s%s_", LanguageTypes[i].id, LanguageSuffixTypes[(int)bankIdx]);
+ return;
+ }
+ }
+ warning("Could not find voice mapping for %i", voice);
// TODO check the rest to reverse
}
@@ -99,7 +108,8 @@ bool Text::initVoxToPlay(const TextEntry *text) {
return false;
}
- if (!_engine->_cfgfile.Voice) {
+ const int voice = ConfMan.getInt("audio_language");
+ if (voice <= 0) {
debug(3, "Voices are disabled");
return false;
}
@@ -108,7 +118,7 @@ bool Text::initVoxToPlay(const TextEntry *text) {
}
bool Text::playVox(const TextEntry *text) {
- if (!_engine->_cfgfile.Voice) {
+ if (ConfMan.getInt("audio_language") <= 0) {
return false;
}
if (text == nullptr) {
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index d4944d3dbb5..d415607bc8f 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -271,7 +271,6 @@ Common::Error TwinEEngine::run() {
debug("(c) 1994 by Adeline Software International, All Rights Reserved.");
ConfMan.registerDefault("usehighres", false);
- ConfMan.registerDefault("wallcollision", false);
const Common::String &gameTarget = ConfMan.getActiveDomainName();
AchMan.setActiveDomain(getMetaEngine()->getAchievementsInfo(gameTarget));
@@ -463,11 +462,13 @@ static int getLanguageTypeIndex(const char *languageName) {
void TwinEEngine::initConfigurations() {
// TODO: use existing entries for some of the settings - like volume and so on.
+ ConfMan.registerDefault("wallcollision", false);
const char *lng = Common::getLanguageDescription(_gameLang);
- _cfgfile.LanguageId = getLanguageTypeIndex(lng);
- _cfgfile.Voice = ConfGetBoolOrDefault("voice", true);
- _cfgfile.FlagDisplayText = ConfGetBoolOrDefault("displaytext", true);
+ _cfgfile._languageId = getLanguageTypeIndex(lng);
+ ConfMan.registerDefault("audio_language", LanguageTypes[_cfgfile._languageId].voice);
+
+ _cfgfile.FlagDisplayText = ConfGetBoolOrDefault("displaytext", true); // TODO: use subtitles
const Common::String midiType = ConfGetOrDefault("miditype", "auto");
if (midiType == "None") {
_cfgfile.MidiType = MIDIFILE_NONE;
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index c4ab49234b4..8997924f3d6 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -60,13 +60,14 @@ namespace TwinE {
static const struct TwinELanguage {
const char *name;
const char *id;
+ const int voice;
} LanguageTypes[] = {
- {"English", "EN_"},
- {"French", "FR_"},
- {"German", "DE_"},
- {"Spanish", "SP_"},
- {"Italian", "IT_"},
- {"Portuguese", ""}};
+ {"English", "EN_", 1},
+ {"French", "FR_", 2},
+ {"German", "DE_", 3},
+ {"Spanish", "SP_", 1},
+ {"Italian", "IT_", 1},
+ {"Portuguese", "", 1}};
enum MidiFileType {
MIDIFILE_NONE,
@@ -88,8 +89,7 @@ enum MovieType {
All the settings with (*) means they are new and only exist in this engine. */
struct ConfigFile {
/** Index into the LanguageTypes array. */
- int32 LanguageId = 0;
- bool Voice = true;
+ int32 _languageId = 0;
/** Enable/Disable game dialogues */
bool FlagDisplayText = false;
/** Flag to display game debug */
More information about the Scummvm-git-logs
mailing list