From ea6eebca09f9303cd08aa6d767123ba383c548e8 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 10 May 2017 15:29:10 -0500 Subject: SCI: Fix reading of Rave data from compressed KQ6 audio volumes Refs Trac#9764. --- engines/sci/resource.cpp | 6 ++++-- engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 11 ++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 2f34f8f433..6ee77fd4c7 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -2010,10 +2010,12 @@ bool ResourceManager::validateResource(const ResourceId &resourceId, const Commo return true; } -void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation) { +Resource *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) { - updateResource(resId, src, offset, size, sourceMapLocation); + return updateResource(resId, src, offset, size, sourceMapLocation); + } else { + return _resMap.getVal(resId); } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index d8651304be..2bbbd42a4a 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -520,7 +520,7 @@ protected: void loadResource(Resource *res); void freeOldResources(); bool validateResource(const ResourceId &resourceId, const Common::String &sourceMapLocation, const Common::String &sourceName, const uint32 offset, const uint32 size, const uint32 sourceSize) const; - void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0, const Common::String &sourceMapLocation = Common::String("(no map location)")); + Resource *addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0, const Common::String &sourceMapLocation = Common::String("(no map location)")); Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size, const Common::String &sourceMapLocation = Common::String("(no map location)")); Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation = Common::String("(no map location)")); void removeAudioResource(ResourceId resId); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 2cd157a631..0b00725d8b 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -444,7 +444,16 @@ int ResourceManager::readAudioMapSCI11(IntMapResourceSource *map) { ptr += 2; if (kq6HiresSyncSize > 0) { - addResource(ResourceId(kResourceTypeRave, map->_mapNumber, n & 0xffffff3f), src, offset + syncSize, kq6HiresSyncSize, map->getLocationName()); + // Rave resources do not have separate entries in the audio + // map (their data was just appended to sync resources), so + // we have to use the sync resource offset first and then + // adjust the offset & size later, otherwise offset + // validation will fail for compressed volumes (since the + // relocation table in a compressed volume only contains + // offsets that existed in the original audio map) + Resource *res = addResource(ResourceId(kResourceTypeRave, map->_mapNumber, n & 0xffffff3f), src, offset, syncSize + kq6HiresSyncSize, map->getLocationName()); + res->_fileOffset += syncSize; + res->_size -= syncSize; syncSize += kq6HiresSyncSize; } } -- cgit v1.2.3