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 | 
