ChunkBlock GhostRoom::readChunkBlock(Common::File &file) { ChunkBlock cb; cb._flavour = (Flavour)file.readByte(); cb._x = file.readSint16LE(); cb._y = file.readSint16LE(); cb._width = file.readSint16LE(); cb._height = file.readSint16LE(); cb._size = file.readSint32LE(); return cb; }
void Background::loadSprites(byte number) { Common::File f; _filename = _filename.format("chunk%d.avd", number); if (!f.open(_filename)) return; // We skip because some rooms don't have sprites in the background. f.seek(44); _spriteNum = f.readByte(); for (int i = 0; i < _spriteNum; i++) _offsets[i] = f.readSint32LE(); for (int i = 0; i < _spriteNum; i++) { f.seek(_offsets[i]); SpriteType sprite; sprite._type = (PictureType)(f.readByte()); sprite._x = f.readSint16LE(); sprite._y = f.readSint16LE(); sprite._width = f.readSint16LE(); sprite._height = f.readSint16LE(); sprite._size = f.readSint32LE(); bool natural = f.readByte(); bool memorize = f.readByte(); if (memorize) { _sprites[i]._x = sprite._x; _sprites[i]._width = sprite._width; _sprites[i]._y = sprite._y; _sprites[i]._height = sprite._height; _sprites[i]._type = sprite._type; if (natural) _vm->_graphics->getNaturalPicture(_sprites[i]); else { _sprites[i]._size = sprite._size; _sprites[i]._picture = _vm->_graphics->loadPictureRaw(f, _sprites[i]._width * 8, _sprites[i]._height + 1); } } else _sprites[i]._x = kOnDisk; } f.close(); }
/** * Draw background animation * @remarks Originally called 'show_one' */ void Background::draw(int16 destX, int16 destY, byte sprId) { assert(sprId < 40); if (_sprites[sprId]._x > kOnDisk) { if (destX < 0) { destX = _sprites[sprId]._x * 8; destY = _sprites[sprId]._y; } drawSprite(destX, destY, _sprites[sprId]); } else { Common::File f; if (!f.open(_filename)) // Filename was set in loadBackgroundSprites(). return; // We skip because some rooms don't have sprites in the background. f.seek(_offsets[sprId]); SpriteType sprite; sprite._type = (PictureType)(f.readByte()); sprite._x = f.readSint16LE(); sprite._y = f.readSint16LE(); sprite._width = f.readSint16LE(); sprite._height = f.readSint16LE(); sprite._size = f.readSint32LE(); f.skip(2); // Natural and Memorize are used in Load() sprite._picture = _vm->_graphics->loadPictureRaw(f, sprite._width * 8, sprite._height + 1); if (destX < 0) { destX = sprite._x * 8; destY = sprite._y; } drawSprite(destX, destY, sprite); sprite._picture.free(); f.close(); } }