MOHAWK: RIVEN: Fix off-by-one ids in ospit for the 25th localized versions

Fixes Trac#10620.
This commit is contained in:
Bastien Bouclet 2018-07-10 19:03:09 +02:00
parent 204060d1f0
commit e105c2a78a
3 changed files with 33 additions and 1 deletions

View File

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

View File

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

View File

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