diff options
author | Filippos Karapetis | 2013-09-26 10:54:30 +0300 |
---|---|---|
committer | Filippos Karapetis | 2013-09-26 10:54:30 +0300 |
commit | 9396958536c487554f79e5a54064c8d37d45fe15 (patch) | |
tree | 558732b6a92bcb9c2ccf9fb1757260b6c977acea /engines/neverhood/resourceman.cpp | |
parent | dca513dc207779bfd36a1c71e3712405a1d9856d (diff) | |
download | scummvm-rg350-9396958536c487554f79e5a54064c8d37d45fe15.tar.gz scummvm-rg350-9396958536c487554f79e5a54064c8d37d45fe15.tar.bz2 scummvm-rg350-9396958536c487554f79e5a54064c8d37d45fe15.zip |
NEVERHOOD: Add a patch system for broken resources in Russian versions
Some translated resources in Russian versions have incorrect unpacked
resource sizes. The original didn't perform checks for these, but we
do, thus we'll need to patch the unpacked resource sizes for each case
Diffstat (limited to 'engines/neverhood/resourceman.cpp')
-rw-r--r-- | engines/neverhood/resourceman.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 37089a5bd6..518755a846 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -85,7 +85,25 @@ void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) resourceHandle._extData = firstEntry ? firstEntry->archiveEntry->extData : NULL; } -void ResourceMan::loadResource(ResourceHandle &resourceHandle) { +struct EntrySizeFix { + uint32 fileHash; + uint32 offset; + uint32 diskSize; + uint32 size; + uint32 fixedSize; +}; + +static const EntrySizeFix entrySizeFixes[] = { + // fileHash offset diskSize size fixedSize + // Fixes for the Russian "Dyadyushka Risech" version + // TODO + // Fixes for the Russian "Fargus" version + // TODO + // + { 0, 0, 0, 0, 0 } +}; + +void ResourceMan::loadResource(ResourceHandle &resourceHandle, bool applyResourceFixes) { resourceHandle._data = NULL; if (resourceHandle.isValid()) { const uint32 fileHash = resourceHandle.fileHash(); @@ -97,8 +115,19 @@ void ResourceMan::loadResource(ResourceHandle &resourceHandle) { if (resourceData->data != NULL) { resourceData->dataRefCount++; } else { - resourceData->data = new byte[resourceHandle._resourceFileEntry->archiveEntry->size]; - resourceHandle._resourceFileEntry->archive->load(resourceHandle._resourceFileEntry->archiveEntry, resourceData->data, 0); + BlbArchiveEntry *entry = resourceHandle._resourceFileEntry->archiveEntry; + + // Apply fixes for broken resources in Russian versions + if (applyResourceFixes) { + for (const EntrySizeFix *cur = entrySizeFixes; cur->fileHash > 0; ++cur) { + if (entry->fileHash == cur->fileHash && entry->offset == cur->offset && + entry->diskSize == cur->diskSize && entry->size == cur->size) + entry->size = cur->fixedSize; + } + } + + resourceData->data = new byte[entry->size]; + resourceHandle._resourceFileEntry->archive->load(entry, resourceData->data, 0); resourceData->dataRefCount = 1; } resourceHandle._data = resourceData->data; |