diff options
-rw-r--r-- | engines/mohawk/myst.cpp | 31 | ||||
-rw-r--r-- | engines/mohawk/resource_cache.cpp | 27 | ||||
-rw-r--r-- | engines/mohawk/resource_cache.h | 6 |
3 files changed, 40 insertions, 24 deletions
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 5835c7e69d..f935e576b7 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -94,10 +94,10 @@ MohawkEngine_Myst::~MohawkEngine_Myst() { // Uses cached data objects in preference to disk access Common::SeekableReadStream *MohawkEngine_Myst::getRawData(uint32 tag, uint16 id) { - Common::SeekableReadStream *ret; + Common::SeekableReadStream *ret = _cache.search(tag, id); - ret = _cache.search(tag, id); - if(ret != NULL) return ret; + if (ret) + return ret; for (uint32 i = 0; i < _mhk.size(); i++) if (_mhk[i]->hasResource(tag, id)) { @@ -106,24 +106,37 @@ Common::SeekableReadStream *MohawkEngine_Myst::getRawData(uint32 tag, uint16 id) return ret; } - error ("Could not find a \'%s\' resource with ID %04x", tag2str(tag), id); + error("Could not find a \'%s\' resource with ID %04x", tag2str(tag), id); return NULL; } void MohawkEngine_Myst::cachePreload(uint32 tag, uint16 id) { - Common::SeekableReadStream *tempData; + if (!_cache.enabled) + return; - if (!_cache.enabled) return; + for (uint32 i = 0; i < _mhk.size(); i++) { + // Check for MJMP in Myst ME + if ((getFeatures() & GF_ME) && tag == ID_MSND && _mhk[i]->hasResource(ID_MJMP, id)) { + Common::SeekableReadStream *tempData = _mhk[i]->getRawData(ID_MJMP, id); + uint16 msndId = tempData->readUint16LE(); + delete tempData; + + // We've found where the real MSND data is, so go get that + tempData = _mhk[i]->getRawData(tag, msndId); + _cache.add(tag, id, tempData); + delete tempData; + return; + } - for (uint32 i = 0; i < _mhk.size(); i++) if (_mhk[i]->hasResource(tag, id)) { - tempData = _mhk[i]->getRawData(tag, id); + Common::SeekableReadStream *tempData = _mhk[i]->getRawData(tag, id); _cache.add(tag, id, tempData); delete tempData; return; } + } - warning ("cachePreload : Could not find a \'%s\' resource with ID %04x", tag2str(tag), id); + warning("cachePreload: Could not find a \'%s\' resource with ID %04x", tag2str(tag), id); } static const char *mystFiles[] = { diff --git a/engines/mohawk/resource_cache.cpp b/engines/mohawk/resource_cache.cpp index 20838ec1bd..8525bbc127 100644 --- a/engines/mohawk/resource_cache.cpp +++ b/engines/mohawk/resource_cache.cpp @@ -38,46 +38,49 @@ ResourceCache::~ResourceCache() { } void ResourceCache::clear() { - if (!enabled) return; + if (!enabled) + return; debugC(kDebugCache, "Clearing Cache..."); - // TODO : Not sure if need to explicitly delete dataObject.data element ie. - // returned by readStream method here. + // TODO: Not sure if need to explicitly delete DataObject.data element ie. + // returned by readStream method here. store.clear(); } void ResourceCache::add(uint32 tag, uint16 id, Common::SeekableReadStream *data) { - if (!enabled) return; + if (!enabled) + return; - debugC(kDebugCache, "Adding item %u - tag 0x%04X id %u", store.size(), tag, id); + debugC(kDebugCache, "Adding item %d - tag 0x%04X id %d", store.size(), tag, id); - dataObject current; + DataObject current; current.tag = tag; current.id = id; - uint32 dataCurPos = data->pos(); + uint32 dataCurPos = data->pos(); current.data = data->readStream(data->size()); - data->seek(dataCurPos, SEEK_SET); + data->seek(dataCurPos); store.push_back(current); } // Returns NULL if not found Common::SeekableReadStream *ResourceCache::search(uint32 tag, uint16 id) { - if (!enabled) return NULL; + if (!enabled) + return NULL; - debugC(kDebugCache, "Searching for tag 0x%04X id %u", tag, id); + debugC(kDebugCache, "Searching for tag 0x%04X id %d", tag, id); for (uint32 i = 0; i < store.size(); i++) { if (tag == store[i].tag && id == store[i].id) { debugC(kDebugCache, "Found cached tag 0x%04X id %u", tag, id); uint32 dataCurPos = store[i].data->pos(); Common::SeekableReadStream *ret = store[i].data->readStream(store[i].data->size()); - store[i].data->seek(dataCurPos, SEEK_SET); + store[i].data->seek(dataCurPos); return ret; } } - debugC(kDebugCache, "tag 0x%04X id %u not found", tag, id); + debugC(kDebugCache, "tag 0x%04X id %d not found", tag, id); return NULL; } diff --git a/engines/mohawk/resource_cache.h b/engines/mohawk/resource_cache.h index e82b43b89e..506d223ff1 100644 --- a/engines/mohawk/resource_cache.h +++ b/engines/mohawk/resource_cache.h @@ -45,13 +45,13 @@ public: Common::SeekableReadStream *search(uint32 tag, uint16 id); private: - typedef struct { + struct DataObject { uint32 tag; uint16 id; Common::SeekableReadStream *data; - } dataObject; + }; - Common::Array<dataObject> store; + Common::Array<DataObject> store; }; } // End of namespace Mohawk |