SHERLOCK: Scene loading for shapes, desc, scripts for Rose Tattoo

This commit is contained in:
Paul Gilbert 2015-05-16 12:27:58 -04:00
parent 7897b72f65
commit 5f5051d7be
3 changed files with 57 additions and 20 deletions

View file

@ -428,10 +428,22 @@ Common::SeekableReadStream *Resources::decompress(Common::SeekableReadStream &so
/**
* Decompress an LZW compressed resource
*/
void Resources::decompress(Common::SeekableReadStream &source, byte *buffer, uint32 outSize) {
assert(_vm->getGameID() == GType_RoseTattoo);
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) {
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;

View file

@ -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);

View file

@ -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);
_bgShapes.resize(bgHeader._numStructs);
for (int idx = 0; idx < bgHeader._numStructs; ++idx)
_bgShapes[idx].load(*infoStream, _vm->getGameID() == GType_RoseTattoo);
if (bgHeader._descSize) {
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);
if (_lzwMode)
delete infoStream;
// 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) {