diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp index c6254ee7b516..2576ff04d6c8 100644 --- a/engines/sherlock/objects.cpp +++ b/engines/sherlock/objects.cpp @@ -1135,17 +1135,30 @@ const Common::Rect Object::getOldBounds() const { /** * Load the data for the animation */ -void CAnim::load(Common::SeekableReadStream &s) { +void CAnim::load(Common::SeekableReadStream &s, bool isRoseTattoo) { char buffer[12]; s.read(buffer, 12); _name = Common::String(buffer); - s.read(_sequences, 30); + if (isRoseTattoo) { + Common::fill(&_sequences[0], &_sequences[30], 0); + _size = s.readUint32LE(); + } else { + s.read(_sequences, 30); + } + _position.x = s.readSint16LE(); _position.y = s.readSint16LE(); - _size = s.readUint32LE(); - _type = (SpriteType)s.readUint16LE(); - _flags = s.readByte(); + + if (isRoseTattoo) { + _flags = s.readByte(); + _scaleVal = s.readSint16LE(); + } else { + _size = s.readUint32LE(); + _type = (SpriteType)s.readUint16LE(); + _flags = s.readByte(); + } + _goto.x = s.readSint16LE(); _goto.y = s.readSint16LE(); _gotoDir = s.readSint16LE(); diff --git a/engines/sherlock/objects.h b/engines/sherlock/objects.h index 2073f06f88df..fd4a103a8dee 100644 --- a/engines/sherlock/objects.h +++ b/engines/sherlock/objects.h @@ -256,17 +256,22 @@ class Object { struct CAnim { Common::String _name; // Name - byte _sequences[MAX_FRAME]; // Animation sequences Common::Point _position; // Position int _size; // Size of uncompressed animation - SpriteType _type; int _flags; // Tells if can be walked behind Common::Point _goto; // coords holmes should walk to before starting canim int _gotoDir; Common::Point _teleportPos; // Location Holmes shoul teleport to after int _teleportDir; // playing canim - void load(Common::SeekableReadStream &s); + // Scalpel specific + byte _sequences[MAX_FRAME]; // Animation sequences + SpriteType _type; + + // Rose Tattoo specific + int _scaleVal; // How much the canim is scaled + + void load(Common::SeekableReadStream &s, bool isRoseTattoo); }; struct SceneImage { diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 034896486edb..0ac2eec0ff1e 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -398,13 +398,14 @@ bool Scene::loadScene(const Common::String &filename) { // Load in cAnim list _cAnim.clear(); if (bgHeader._numcAnimations) { + int animSize = _vm->getGameID() == GType_SerratedScalpel ? 65 : 47; Common::SeekableReadStream *canimStream = _lzwMode ? - Resources::decompressLZ(*rrmStream, 65 * bgHeader._numcAnimations) : - rrmStream->readStream(65 * bgHeader._numcAnimations); + res.decompress(*rrmStream, animSize * bgHeader._numcAnimations) : + rrmStream->readStream(animSize * bgHeader._numcAnimations); _cAnim.resize(bgHeader._numcAnimations); for (uint idx = 0; idx < _cAnim.size(); ++idx) - _cAnim[idx].load(*canimStream); + _cAnim[idx].load(*canimStream, _vm->getGameID() == GType_RoseTattoo); delete canimStream; }