diff options
Diffstat (limited to 'engines/sci/resource.cpp')
-rw-r--r-- | engines/sci/resource.cpp | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 91cceb5968..2f34f8f433 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -2013,20 +2013,7 @@ bool ResourceManager::validateResource(const ResourceId &resourceId, const Commo void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation) { // Adding new resource only if it does not exist if (_resMap.contains(resId) == false) { - Common::SeekableReadStream *volumeFile = getVolumeFile(src); - if (volumeFile == nullptr) { - error("Could not open %s for reading", src->getLocationName().c_str()); - } - - if (validateResource(resId, sourceMapLocation, src->getLocationName(), offset, size, volumeFile->size())) { - Resource *res = new Resource(this, resId); - _resMap.setVal(resId, res); - res->_source = src; - res->_fileOffset = offset; - res->_size = size; - } else { - _hasBadResources = true; - } + updateResource(resId, src, offset, size, sourceMapLocation); } } @@ -2048,6 +2035,13 @@ Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, error("Could not open %s for reading", src->getLocationName().c_str()); } + AudioVolumeResourceSource *avSrc = dynamic_cast<AudioVolumeResourceSource *>(src); + if (avSrc != nullptr && !avSrc->relocateMapOffset(offset, size)) { + warning("Compressed volume %s does not contain a valid entry for %s (map offset %u)", src->getLocationName().c_str(), resId.toString().c_str(), offset); + _hasBadResources = true; + return res; + } + if (validateResource(resId, sourceMapLocation, src->getLocationName(), offset, size, volumeFile->size())) { if (res == nullptr) { res = new Resource(this, resId); |