[Scummvm-git-logs] scummvm master -> 2e327f38ede37847e54c4fe51a6858e5fae424d3
aquadran
noreply at scummvm.org
Mon Jan 5 12:53:06 UTC 2026
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
e31ae4106e WINTERMUTE: Improve support for sotv1/sotv2
99fef9ac58 WINTERMUTE: Fix retrieval of sound duration
2e327f38ed WINTERMUTE: Fix handling of empty strings
Commit: e31ae4106e2334f7618d893d7873e742caf6dd4a
https://github.com/scummvm/scummvm/commit/e31ae4106e2334f7618d893d7873e742caf6dd4a
Author: Dario Scarpa (3518552+darioscarpa at users.noreply.github.com)
Date: 2026-01-05T13:53:01+01:00
Commit Message:
WINTERMUTE: Improve support for sotv1/sotv2
The latest Steam releases of "Shadows on the Vatican" Act I and II
include a launcher which allows loading a subset of WME packages
according to the options selected by the user.
This allows, with a single set of packages, to run the game with
- SD or HD assets
- one of two speech languages (it/en)
- one of seven subtitle languages (it/en/fr/es/de/pl/ru)
...for a total of 2*2*7=28 combinations.
This contribution adds two gui options specific to sotv1/sotv2
(use_sd_assets and use_it_voices) and the code which uses them,
together with the "language" option, to load the correct
packages in the Wintermute BaseFileManager.
Changed paths:
engines/wintermute/base/base_file_manager.cpp
engines/wintermute/detection.h
engines/wintermute/detection_tables.h
engines/wintermute/metaengine.cpp
diff --git a/engines/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp
index b2e207387ab..8a2e64ec382 100644
--- a/engines/wintermute/base/base_file_manager.cpp
+++ b/engines/wintermute/base/base_file_manager.cpp
@@ -37,6 +37,7 @@
#include "engines/wintermute/dcgf.h"
#include "common/algorithm.h"
+#include "common/array.h"
#include "common/debug.h"
#include "common/str.h"
#include "common/tokenizer.h"
@@ -177,6 +178,49 @@ bool BaseFileManager::initPaths() {
if (languageSubFolder.exists()) {
addPath(PATH_PACKAGE, languageSubFolder);
}
+
+ // Special paths init for the SD/HD combo multi-language versions of sotv:
+ // such versions include a launcher which allows selecting the SD/HD
+ // version and mixing any combination of available voices and subtitles
+ bool use_sd_assets = ConfMan.getBool("use_sd_assets"); // if false: hd
+ bool use_it_voices = ConfMan.getBool("use_it_voices"); // if false: en
+ Common::Language lang = Common::parseLanguage(ConfMan.get("language"));
+ switch (lang) {
+ case Common::DE_DEU:
+ case Common::EN_ANY:
+ case Common::ES_ESP:
+ case Common::FR_FRA:
+ case Common::IT_ITA:
+ case Common::PL_POL:
+ case Common::RU_RUS:
+ // supported (in terms of subtitles) language selected, all good
+ break;
+ default:
+ // unsupported language selected, fallback to English subtitles
+ lang = Common::EN_ANY;
+ break;
+ }// switch(lang)
+
+ // Now that we have values for the three options needed (SD/HD, voices
+ // language and subtitles language), we can emulate the SotV launcher logic,
+ // which, according to the options selected via its UI, writes to the
+ // Windows registry a suitable "PackagePaths" entry. Such entry is then used
+ // by WME on startup to load only the subset of the available packages which
+ // is relevant to the selected options, avoiding incorrect overrides.
+ Common::Array<Common::String> sotvSubfolders;
+ sotvSubfolders.push_back("common");
+ sotvSubfolders.push_back(use_sd_assets ? "common_sd" : "common_hd");
+ sotvSubfolders.push_back(use_it_voices ? "i18n_audio_it" : "i18n_audio_en");
+ sotvSubfolders.push_back(Common::String::format("i18n_%s", Common::getLanguageCode(lang)));
+ sotvSubfolders.push_back(Common::String::format("i18n_%s_%s", Common::getLanguageCode(lang), use_sd_assets ? "sd" : "hd"));
+ for (const auto &sotvSubfolder : sotvSubfolders) {
+ Common::FSNode subFolder = gameData.getChild(sotvSubfolder);
+ if (subFolder.exists()) {
+ addPath(PATH_PACKAGE, subFolder);
+ }
+ }
+ // end of special sotv1/sotv2 paths init
+
return STATUS_OK;
}
diff --git a/engines/wintermute/detection.h b/engines/wintermute/detection.h
index a22b7081b8c..f5695356fd9 100644
--- a/engines/wintermute/detection.h
+++ b/engines/wintermute/detection.h
@@ -141,6 +141,8 @@ struct WMEGameDescription {
#define GAMEOPTION_FORCE_2D_RENDERER GUIO_GAMEOPTIONS3
#endif
#define GAMEOPTION_TTS GUIO_GAMEOPTIONS4
+#define GAMEOPTION_USE_IT_VOICES GUIO_GAMEOPTIONS5
+#define GAMEOPTION_USE_SD_ASSETS GUIO_GAMEOPTIONS6
} // End of namespace Wintermute
diff --git a/engines/wintermute/detection_tables.h b/engines/wintermute/detection_tables.h
index 34c936d5dfb..a8725fb6fb9 100644
--- a/engines/wintermute/detection_tables.h
+++ b/engines/wintermute/detection_tables.h
@@ -228,6 +228,21 @@ static const PlainGameDescriptor wintermuteGames[] = {
version \
}
+// sotv1 and sotv2 need some extra gui options
+#define WME_SOTVENTRY(shortName, extraName, hashEntry, lang, status, version) \
+ { \
+ { \
+ shortName, \
+ extraName, \
+ hashEntry, \
+ lang, \
+ Common::kPlatformWindows, \
+ status, \
+ GUIO2(GAMEOPTION_USE_IT_VOICES, GAMEOPTION_USE_SD_ASSETS), \
+ }, \
+ version \
+ }
+
/* To add new entries:
* Make sure you have a target name defined at the top of the file
*
@@ -4820,6 +4835,10 @@ static const WMEGameDescription gameDescriptions[] = {
WME_WINENTRY("sotv1", "Legacy Version",
WME_ENTRY1s("default.game", "2631e8ba12cdd7ef08c5ee72391ad703", 968), Common::FA_IRN, ADGF_UNSTABLE | GF_3D, WME_1_9_1),
+ // Shadows on the Vatican - Act I: Greed (SD/HD Combo Version) (Steam) (Multi-language)
+ WME_SOTVENTRY("sotv1", "SD/HD Combo Version",
+ WME_ENTRY1s("SotV1.exe", "c7302599bcd570cfb8bdb9027e0ad344", 2335232), Common::UNK_LANG, ADGF_UNSTABLE | GF_3D, WME_1_9_3),
+
// Shadows on the Vatican - Act II: Wrath (Legacy Version) (Steam, Oct 26th 2015) (English)
WME_WINENTRY("sotv2", "Legacy Version/Steam",
WME_ENTRY3s("data.dcp", "cfea0d6c7e4a96627d16887c3480266a", 273132663,
@@ -5456,6 +5475,10 @@ static const WMEGameDescription gameDescriptions[] = {
"data_hd.dcp", "61b79bd9f732e48bb097227ee615463b", 272405838,
"i18n_pl_strings.dcp", "67c194c45375d2e26f8bf5ae17800944", 119354), Common::PL_POL, ADGF_UNSTABLE | GF_IGNORE_SD_FILES | GF_3D, WME_1_9_3),
+ // Shadows on the Vatican - Act II: Wrath (SD/HD Combo Version) (Steam) (Multi-language)
+ WME_SOTVENTRY("sotv2", "SD/HD Combo Version",
+ WME_ENTRY1s("SotV2.exe", "c7302599bcd570cfb8bdb9027e0ad344", 2335232), Common::UNK_LANG, ADGF_UNSTABLE | GF_3D, WME_1_9_3),
+
// Shelter (Demo)
WME_WINENTRY("shelter", "Demo",
WME_ENTRY1s("data.dcp", "789f15a26fc06a814cfca723e33fc5f7", 5417715), Common::EN_ANY, ADGF_UNSTABLE | ADGF_DEMO, WME_1_6_2),
diff --git a/engines/wintermute/metaengine.cpp b/engines/wintermute/metaengine.cpp
index e44ecb97b25..d1772d346e4 100644
--- a/engines/wintermute/metaengine.cpp
+++ b/engines/wintermute/metaengine.cpp
@@ -88,6 +88,30 @@ static const ADExtraGuiOptionsMap gameGuiOptions[] = {
},
#endif
+ {
+ GAMEOPTION_USE_IT_VOICES,
+ {
+ _s("Use Italian speech pack"),
+ _s("Use Italian dubbing instead of the default English one"),
+ "use_it_voices",
+ false,
+ 0,
+ 0
+ }
+ },
+
+ {
+ GAMEOPTION_USE_SD_ASSETS,
+ {
+ _s("Run SD version (1280x800)"),
+ _s("Run the legacy SD version, which is better for small screens"),
+ "use_sd_assets",
+ false,
+ 0,
+ 0
+ }
+ },
+
AD_EXTRA_GUI_OPTIONS_TERMINATOR
};
Commit: 99fef9ac58615d1ff48c40cb9b83646ab53776e7
https://github.com/scummvm/scummvm/commit/99fef9ac58615d1ff48c40cb9b83646ab53776e7
Author: Dario Scarpa (3518552+darioscarpa at users.noreply.github.com)
Date: 2026-01-05T13:53:01+01:00
Commit Message:
WINTERMUTE: Fix retrieval of sound duration
The sound duration in milliseconds was incorrectly multiplied by 1000
before being returned.
This was discovered while trying to get sotv2 running properly.
Specifically, a Sleep(Game.GetSoundLength(SomeSound) - 400) instruction
caused the game to freeze, because a script started waiting for
(6879000 - 400) msec instead of (6879 - 400) msec.
So, this bugfix solves the freeze currently listed in the wiki
(https://wiki.scummvm.org/index.php?title=Wintermute/Games) as
"Freezes during dialogue in the first location".
Changed paths:
engines/wintermute/base/sound/base_sound_buffer.cpp
diff --git a/engines/wintermute/base/sound/base_sound_buffer.cpp b/engines/wintermute/base/sound/base_sound_buffer.cpp
index 75f93e080ee..d54309369ef 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.cpp
+++ b/engines/wintermute/base/sound/base_sound_buffer.cpp
@@ -221,7 +221,7 @@ bool BaseSoundBuffer::pause() {
uint32 BaseSoundBuffer::getLength() {
if (_stream) {
uint32 len = _stream->getLength().msecs();
- return len * 1000;
+ return len;
}
return 0;
}
Commit: 2e327f38ede37847e54c4fe51a6858e5fae424d3
https://github.com/scummvm/scummvm/commit/2e327f38ede37847e54c4fe51a6858e5fae424d3
Author: Dario Scarpa (3518552+darioscarpa at users.noreply.github.com)
Date: 2026-01-05T13:53:01+01:00
Commit Message:
WINTERMUTE: Fix handling of empty strings
Comparing the code with the original WME source code, we can notice
that an extra check (for empty string) was added in scummvm, which
subtly changes the semantics: zero length strings are treated as
invalid, which doesn't match the original engine behaviour.
This was discovered while trying to get sotv1 running properly.
Specifically, this fix prevents the freeze currently listed in the wiki
(https://wiki.scummvm.org/index.php?title=Wintermute/Games) as
"Freezes near the beginning during a phonecall after leaving the bar".
The game calls `someEntity.TalkAsync("", someAudio)` and scummvm was
unable to proceed because the entity got stuck in `STATE_TALKING`, as
the AdSentence created with "" caused `display()` to return
`STATUS_FAILED` and not setting `_soundStarted` to `true`, which in
turn made it impossible to evaluate `timeIsUp` to `true` and call
`_sentence->finish()` (and go back to `STATE_READY`), causing the
freeze.
Similar instances of zero-length strings treated as `null` remain to be
investigated.
Changed paths:
engines/wintermute/ad/ad_sentence.cpp
diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp
index 37ce1bd0156..b3cdf298809 100644
--- a/engines/wintermute/ad/ad_sentence.cpp
+++ b/engines/wintermute/ad/ad_sentence.cpp
@@ -184,7 +184,7 @@ char *AdSentence::getStance(int stance) {
//////////////////////////////////////////////////////////////////////////
bool AdSentence::display() {
- if (!_font || !_text || !_text[0]) {
+ if (!_font || !_text) {
return STATUS_FAILED;
}
More information about the Scummvm-git-logs
mailing list