diff options
| author | Paul Gilbert | 2015-05-16 12:27:58 -0400 | 
|---|---|---|
| committer | Paul Gilbert | 2015-05-16 12:27:58 -0400 | 
| commit | 5f5051d7be5317153ae079c0c9c32ec2008c4a2c (patch) | |
| tree | fb49385ece99c4f8d97a163bb3f5a25cec58cc2a | |
| parent | 7897b72f655c8f65fd206aea12cfd06921d75124 (diff) | |
| download | scummvm-rg350-5f5051d7be5317153ae079c0c9c32ec2008c4a2c.tar.gz scummvm-rg350-5f5051d7be5317153ae079c0c9c32ec2008c4a2c.tar.bz2 scummvm-rg350-5f5051d7be5317153ae079c0c9c32ec2008c4a2c.zip | |
SHERLOCK: Scene loading for shapes, desc, scripts for Rose Tattoo
| -rw-r--r-- | engines/sherlock/resources.cpp | 20 | ||||
| -rw-r--r-- | engines/sherlock/resources.h | 1 | ||||
| -rw-r--r-- | engines/sherlock/scene.cpp | 54 | 
3 files changed, 56 insertions, 19 deletions
| diff --git a/engines/sherlock/resources.cpp b/engines/sherlock/resources.cpp index 02030119c0..9acba0ba2f 100644 --- a/engines/sherlock/resources.cpp +++ b/engines/sherlock/resources.cpp @@ -428,10 +428,22 @@ Common::SeekableReadStream *Resources::decompress(Common::SeekableReadStream &so  /**   * Decompress an LZW compressed resource   */ +Common::SeekableReadStream *Resources::decompress(Common::SeekableReadStream &source, uint32 outSize) { +	int inSize = (_vm->getGameID() == GType_RoseTattoo) ? source.readUint32LE() : -1; +	byte *outBuffer = (byte *)malloc(outSize); +	Common::MemoryReadStream *outStream = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES); + +	decompressLZ(source, outBuffer, outSize, inSize); + +	return outStream; +} + +/** + * Decompress an LZW compressed resource + */  void Resources::decompress(Common::SeekableReadStream &source, byte *buffer, uint32 outSize) { -	assert(_vm->getGameID() == GType_RoseTattoo); +	int inputSize = (_vm->getGameID() == GType_RoseTattoo) ? source.readUint32LE() : -1; -	uint32 inputSize = source.readUint32LE();  	decompressLZ(source, buffer, outSize, inputSize);  } @@ -442,7 +454,7 @@ Common::SeekableReadStream *Resources::decompressLZ(Common::SeekableReadStream &  	byte *outBuffer = (byte *)malloc(outSize);  	Common::MemoryReadStream *outStream = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES); -	decompressLZ(source, outSize); +	decompressLZ(source, outBuffer, outSize, -1);  	return outStream;  } @@ -451,7 +463,7 @@ void Resources::decompressLZ(Common::SeekableReadStream &source, byte *outBuffer  	uint16 lzWindowPos;  	uint16 cmd;  	byte *outBufferEnd = outBuffer + outSize; -	uint32 endPos = source.pos() + inSize; +	int32 endPos = source.pos() + inSize;  	memset(lzWindow, 0xFF, 0xFEE);  	lzWindowPos = 0xFEE; diff --git a/engines/sherlock/resources.h b/engines/sherlock/resources.h index 0765ce4642..a3208520ea 100644 --- a/engines/sherlock/resources.h +++ b/engines/sherlock/resources.h @@ -91,6 +91,7 @@ public:  	int resourceIndex() const;  	Common::SeekableReadStream *decompress(Common::SeekableReadStream &source); +	Common::SeekableReadStream *decompress(Common::SeekableReadStream &source, uint32 outSize);  	void decompress(Common::SeekableReadStream &source, byte *buffer, uint32 outSize);  	static void decompressLZ(Common::SeekableReadStream &source, byte *outBuffer, int32 outSize, int32 inSize);  	static Common::SeekableReadStream *decompressLZ(Common::SeekableReadStream &source, uint32 outSize); diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index e473217ba9..54155db4bb 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -316,28 +316,52 @@ bool Scene::loadScene(const Common::String &filename) {  			bgInfo[idx].load(*rrmStream);  		// Read information -		int shapeSize = _vm->getGameID() == GType_SerratedScalpel ? 569 : 591; -		Common::SeekableReadStream *infoStream = !_lzwMode ? rrmStream : -			Resources::decompressLZ(*rrmStream, bgHeader._numImages * shapeSize + -				bgHeader._descSize + bgHeader._seqSize); +		if (_vm->getGameID() == GType_SerratedScalpel) { +			Common::SeekableReadStream *infoStream = !_lzwMode ? rrmStream : +				res.decompress(*rrmStream, bgHeader._numImages * 569 + bgHeader._descSize + bgHeader._seqSize); + +			_bgShapes.resize(bgHeader._numStructs); +			for (int idx = 0; idx < bgHeader._numStructs; ++idx) +				_bgShapes[idx].load(*infoStream, _vm->getGameID() == GType_RoseTattoo); + +			if (bgHeader._descSize) { +				_descText.resize(bgHeader._descSize); +				infoStream->read(&_descText[0], bgHeader._descSize); +			} + +			if (bgHeader._seqSize) { +				_sequenceBuffer.resize(bgHeader._seqSize); +				infoStream->read(&_sequenceBuffer[0], bgHeader._seqSize); +			} + +			if (_lzwMode) +				delete infoStream; +		} else { +			// Load shapes +			Common::SeekableReadStream *infoStream = !_lzwMode ? rrmStream : res.decompress(*rrmStream, bgHeader._numImages * 625); + +			_bgShapes.resize(bgHeader._numStructs); +			for (int idx = 0; idx < bgHeader._numStructs; ++idx) +				_bgShapes[idx].load(*infoStream, _vm->getGameID() == GType_RoseTattoo); -		_bgShapes.resize(bgHeader._numStructs); -		for (int idx = 0; idx < bgHeader._numStructs; ++idx) -			_bgShapes[idx].load(*infoStream, _vm->getGameID() == GType_RoseTattoo); +			if (_lzwMode) +				delete infoStream; -		if (bgHeader._descSize) { +			// Load description text  			_descText.resize(bgHeader._descSize); -			infoStream->read(&_descText[0], bgHeader._descSize); -		} +			if (_lzwMode) +				res.decompress(*rrmStream, (byte *)&_descText[0], bgHeader._descSize); +			else +				rrmStream->read(&_descText[0], bgHeader._descSize); -		if (bgHeader._seqSize) { +			// Load sequences  			_sequenceBuffer.resize(bgHeader._seqSize); -			infoStream->read(&_sequenceBuffer[0], bgHeader._seqSize); +			if (_lzwMode) +				res.decompress(*rrmStream, &_sequenceBuffer[0], bgHeader._seqSize); +			else +				rrmStream->read(&_sequenceBuffer[0], bgHeader._seqSize);  		} -		if (_lzwMode) -			delete infoStream; -  		// Set up the list of images used by the scene  		_images.resize(bgHeader._numImages + 1);  		for (int idx = 0; idx < bgHeader._numImages; ++idx) { | 
