diff options
-rw-r--r-- | engines/sherlock/objects.cpp | 38 | ||||
-rw-r--r-- | engines/sherlock/objects.h | 19 | ||||
-rw-r--r-- | engines/sherlock/scene.cpp | 95 | ||||
-rw-r--r-- | engines/sherlock/scene.h | 5 |
4 files changed, 136 insertions, 21 deletions
diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp index 2386c00686..73e6397b50 100644 --- a/engines/sherlock/objects.cpp +++ b/engines/sherlock/objects.cpp @@ -101,7 +101,10 @@ void Object::synchronize(Common::SeekableReadStream &s) { _sequences = nullptr; _images = nullptr; _imageFrame = nullptr; - s.seek(16, SEEK_CUR); + + s.skip(4); + _sequenceOffset = s.readUint32LE(); + s.seek(8, SEEK_CUR); _walkCount = s.readByte(); _allow = s.readByte(); @@ -133,7 +136,7 @@ void Object::synchronize(Common::SeekableReadStream &s) { _aOpen.synchronize(s); _aType = s.readByte(); _lookFrames = s.readByte(); - _seqcounter = s.readByte(); + _seqCounter = s.readByte(); _lookPosition.x = s.readUint16LE(); _lookPosition.y = s.readByte(); _lookFacing = s.readByte(); @@ -141,7 +144,7 @@ void Object::synchronize(Common::SeekableReadStream &s) { _aClose.synchronize(s); _seqStack = s.readByte(); _seqTo = s.readByte(); - _descOfs = s.readUint16LE(); + _descOffset = s.readUint16LE(); _seqcounter2 = s.readByte(); _seqSize = s.readUint16LE(); s.skip(1); @@ -152,4 +155,33 @@ void Object::synchronize(Common::SeekableReadStream &s) { _use[idx].synchronize(s); } +/*----------------------------------------------------------------*/ + +void CAnim::synchronize(Common::SeekableReadStream &s) { + char buffer[12]; + s.read(buffer, 12); + _name = Common::String(buffer); + + s.read(_sequences, 30); + _position.x = s.readSint16LE(); + _position.y = s.readSint16LE(); + _size = s.readUint32LE(); + _type = (SpriteType)s.readUint16LE(); + _flags = s.readByte(); + _goto.x = s.readSint16LE(); + _goto.y = s.readSint16LE(); + _sequenceNumber = s.readSint16LE(); + _teleportPos.x = s.readSint16LE(); + _teleportPos.y = s.readSint16LE(); + _teleportS = s.readSint16LE(); +} + +/*----------------------------------------------------------------*/ + +InvGraphicType::InvGraphicType() { + _images = nullptr; + _maxFrames = 0; + _filesize = 0; +} + } // End of namespace Sherlock diff --git a/engines/sherlock/objects.h b/engines/sherlock/objects.h index f730240479..31d9520932 100644 --- a/engines/sherlock/objects.h +++ b/engines/sherlock/objects.h @@ -104,8 +104,9 @@ struct UseType { struct Object { Common::String _name; // Name Common::String _description; // Description - Common::StringArray _examine; // Examine in-depth description - uint8 (*_sequences)[MAX_HOLMES_SEQUENCE][MAX_FRAME]; // Holds animation sequences + Common::String _examine; // Examine in-depth description + int _sequenceOffset; + uint8 *_sequences; // Holds animation sequences ImageFile *_images; // Sprite images ImageFrame *_imageFrame; // Pointer to shape in the images int _walkCount; // Character walk counter @@ -132,14 +133,14 @@ struct Object { ActionType _aOpen; // Holds data for moving object int _aType; // Tells if this is an object, person, talk, etc. int _lookFrames; // How many frames to play of the look anim before pausing - int _seqcounter; // How many times this sequence has been executed + int _seqCounter; // How many times this sequence has been executed Common::Point _lookPosition; // Where to walk when examining object int _lookFacing; // Direction to face when examining object int _lookcAnim; ActionType _aClose; int _seqStack; // Allows gosubs to return to calling frame int _seqTo; // Allows 1-5, 8-3 type sequences encoded in 2 bytes - uint _descOfs; // Tells where description starts in DescText + uint _descOffset; // Tells where description starts in DescText int _seqcounter2; // Counter of calling frame sequence uint _seqSize; // Tells where description starts ActionType _aMove; @@ -159,8 +160,18 @@ struct CAnim { int _sequenceNumber; Common::Point _teleportPos; // Location Holmes shoul teleport to after int _teleportS; // playing canim + + void synchronize(Common::SeekableReadStream &s); }; +struct InvGraphicType { + ImageFile *_images; // Object images + int _maxFrames; // How many frames in object + int _filesize; // File size + + InvGraphicType(); +} ; + } // End of namespace Sherlock #endif diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 267b02b43c..ffae6f60c1 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -38,7 +38,7 @@ void BgFileHeader::synchronize(Common::SeekableReadStream &s) { /*----------------------------------------------------------------*/ void BgfileheaderInfo::synchronize(Common::SeekableReadStream &s) { - _fSize = s.readUint32LE(); + _filesize = s.readUint32LE(); _maxFrames = s.readByte(); char buffer[9]; @@ -71,6 +71,15 @@ Scene::Scene(SherlockEngine *vm): _vm(vm) { Scene::~Scene() { delete _controls; + clear(); +} + +/** + * Takes care of clearing any scene data + */ +void Scene::clear() { + for (uint idx = 0; idx < _bgShapes.size(); ++idx) + delete _bgShapes[idx]._images; } void Scene::selectScene() { @@ -108,6 +117,7 @@ void Scene::loadScene(const Common::String &filename) { _roomBounds.clear(); _roomBounds.push_back(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT)); + clear(); _descText.clear(); _comments = ""; _bgShapes.clear(); @@ -131,8 +141,6 @@ void Scene::loadScene(const Common::String &filename) { rrmStream->seek(rrmStream->readUint32LE()); BgFileHeader bgHeader; bgHeader.synchronize(*rrmStream); - - _cAnim.resize(bgHeader._numcAnimations); _invGraphicItems = bgHeader._numImages + 1; // Read in the shapes header info @@ -142,20 +150,13 @@ void Scene::loadScene(const Common::String &filename) { for (uint idx = 0; idx < bgInfo.size(); ++idx) bgInfo[idx].synchronize(*rrmStream); - // Initialize the cAnim - for (uint idx = 0; idx < _cAnim.size(); ++idx) { - _cAnim[idx]._position.x = -1; - _cAnim[idx]._goto.x = -1; - _cAnim[idx]._teleportPos.x = -1; - } - // Read information Common::SeekableReadStream *infoStream = !_lzwMode ? rrmStream : decompressLZ(*rrmStream, bgHeader._numImages * 569 + bgHeader._descSize + bgHeader._seqSize); - _bgShapes.resize(bgHeader._numStructs); - for (uint idx = 0; idx < _bgShapes.size(); ++idx) + _bgShapes.resize(bgHeader._numStructs + 1); + for (int idx = 0; idx < bgHeader._numStructs; ++idx) _bgShapes[idx].synchronize(*infoStream); if (bgHeader._descSize) { @@ -171,11 +172,79 @@ void Scene::loadScene(const Common::String &filename) { if (_lzwMode) delete infoStream; - // Load shapes + // Set up inv list + _inv.resize(bgHeader._numImages + 1); + for (int idx = 0; idx < bgHeader._numImages; ++idx) { + _inv[idx + 1]._filesize = bgInfo[idx]._filesize; + _inv[idx + 1]._maxFrames = bgInfo[idx]._maxFrames; + + // Read in the image data + Common::SeekableReadStream *imageStream = !_lzwMode ? rrmStream : + decompressLZ(*rrmStream, bgInfo[idx]._filesize); + + _inv[idx + 1]._images = new ImageFile(*imageStream); + + if (_lzwMode) + delete imageStream; + } + + // Set up the bgShapes + for (int idx = 0; idx < bgHeader._numStructs; ++idx) { + _bgShapes[idx]._examine = Common::String(&_descText[_bgShapes[idx]._descOffset]); + _bgShapes[idx]._sequences = &_sequenceBuffer[_bgShapes[idx]._sequenceOffset]; + _bgShapes[idx]._misc = 0; + _bgShapes[idx]._seqCounter = 0; + _bgShapes[idx]._seqcounter2 = 0; + _bgShapes[idx]._seqStack = 0; + _bgShapes[idx]._frameNumber = -1; + _bgShapes[idx]._position = Common::Point(0, 0); + _bgShapes[idx]._oldSize = Common::Point(1, 1); + + _bgShapes[idx]._images = _inv[_bgShapes[idx]._misc]._images; + _bgShapes[idx]._imageFrame = !_bgShapes[idx]._images ? (ImageFrame *)nullptr : + &(*_bgShapes[idx]._images)[0]; + } + + // Set up end of list + _bgShapes[bgHeader._numStructs]._sequences = &_sequenceBuffer[0] + bgHeader._seqSize; + _bgShapes[bgHeader._numStructs]._examine = nullptr; + + // Load in cAnim list + Common::SeekableReadStream *canimStream = !_lzwMode ? rrmStream : + decompressLZ(*rrmStream, 65 * bgHeader._numcAnimations); + + _cAnim.resize(bgHeader._numcAnimations); + for (uint idx = 0; idx < _cAnim.size(); ++idx) + _cAnim[idx].synchronize(*canimStream); + + if (_lzwMode) + delete canimStream; + + // Read in the room bounding areas + int size = rrmStream->readUint16LE(); + Common::SeekableReadStream *boundsStream = !_lzwMode ? rrmStream : + decompressLZ(*rrmStream, size); + + _roomBounds.resize(size / 10); + for (uint idx = 0; idx < _roomBounds.size(); ++idx) { + _roomBounds[idx].left = boundsStream->readSint16LE(); + _roomBounds[idx].top = boundsStream->readSint16LE(); + _roomBounds[idx].setWidth(boundsStream->readSint16LE()); + _roomBounds[idx].setHeight(boundsStream->readSint16LE()); + boundsStream->skip(2); // Skip unused scene number field + } + + if (_lzwMode) + delete boundsStream; + + // Back at version byte, so skip over it + rrmStream->skip(1); + // TODO delete rrmStream; } + } } // End of namespace Sherlock diff --git a/engines/sherlock/scene.h b/engines/sherlock/scene.h index e216c2bd9d..2280e169b7 100644 --- a/engines/sherlock/scene.h +++ b/engines/sherlock/scene.h @@ -47,7 +47,7 @@ struct BgFileHeader { }; struct BgfileheaderInfo { - int _fSize; // How long images are + int _filesize; // How long images are int _maxFrames; // How many unique frames in object Common::String _filename; // Filename of object @@ -85,10 +85,13 @@ public: Common::Array<Object> _bgShapes; Common::Array<CAnim> _cAnim; Common::Array<byte> _sequenceBuffer; + Common::Array<InvGraphicType> _inv; public: Scene(SherlockEngine *vm); ~Scene(); + void clear(); + void selectScene(); }; |