aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Bouclet2018-07-10 19:03:09 +0200
committerBastien Bouclet2018-07-10 19:09:30 +0200
commite105c2a78ae14a0b3c6645fe98db98f3c299f13f (patch)
tree0a882e4cdea019535f8a11b16d4cf3b3cd71eef0
parent204060d1f0b88a5e1d4cb2010a76080281e3a327 (diff)
downloadscummvm-rg350-e105c2a78ae14a0b3c6645fe98db98f3c299f13f.tar.gz
scummvm-rg350-e105c2a78ae14a0b3c6645fe98db98f3c299f13f.tar.bz2
scummvm-rg350-e105c2a78ae14a0b3c6645fe98db98f3c299f13f.zip
MOHAWK: RIVEN: Fix off-by-one ids in ospit for the 25th localized versions
Fixes Trac#10620.
-rw-r--r--engines/mohawk/resource.cpp19
-rw-r--r--engines/mohawk/resource.h2
-rw-r--r--engines/mohawk/riven.cpp13
3 files changed, 33 insertions, 1 deletions
diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp
index ea44ca7879..e8e382ad00 100644
--- a/engines/mohawk/resource.cpp
+++ b/engines/mohawk/resource.cpp
@@ -154,6 +154,25 @@ Common::Array<uint16> Archive::getResourceIDList(uint32 type) const {
return idList;
}
+void Archive::offsetResourceIDs(uint32 type, uint16 startId, int16 increment) {
+ if (!_types.contains(type)) {
+ return;
+ }
+
+ const ResourceMap &oldResMap = _types[type];
+ ResourceMap newResMap;
+
+ for (ResourceMap::const_iterator it = oldResMap.begin(); it != oldResMap.end(); it++) {
+ if (it->_key >= startId) {
+ newResMap[it->_key + increment] = it->_value;
+ } else {
+ newResMap[it->_key] = it->_value;
+ }
+ }
+
+ _types[type] = newResMap;
+}
+
// Mohawk Archive code
struct FileTableEntry {
diff --git a/engines/mohawk/resource.h b/engines/mohawk/resource.h
index 809c55da1d..426e022ae4 100644
--- a/engines/mohawk/resource.h
+++ b/engines/mohawk/resource.h
@@ -145,6 +145,8 @@ public:
Common::Array<uint32> getResourceTypeList() const;
Common::Array<uint16> getResourceIDList(uint32 type) const;
+ /** Offset the resource ids for a resource type by the specified amount */
+ void offsetResourceIDs(uint32 type, uint16 startId, int16 increment);
protected:
Common::SeekableReadStream *_stream;
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 57d7da3770..4285ef7382 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -400,8 +400,19 @@ void MohawkEngine_Riven::changeToStack(uint16 stackId) {
Common::String languageDatafile = getLanguageDatafile(prefix);
if (!languageDatafile.empty()) {
MohawkArchive *mhk = new MohawkArchive();
- if (mhk->openFile(languageDatafile))
+ if (mhk->openFile(languageDatafile)) {
+
+ if (stackId == kStackOspit && (getLanguage() != Common::EN_ANY || getLanguage() != Common::RU_RUS)) {
+ // WORKAROUND: The international CD versions were repacked for the 25th anniversary release
+ // so they share the same resources as the English DVD version. The resource IDs for the DVD
+ // version resources have a delta of 1 in their numbering when compared the the CD version
+ // resources for Gehn's office. Unfortunately this delta was not compensated when repacking
+ // the archives. We need to do it here at run time...
+ mhk->offsetResourceIDs(ID_TBMP, 196, 1);
+ }
+
_mhk.push_back(mhk);
+ }
else
delete mhk;
}