diff options
author | Dmitry Iskrich | 2016-06-06 17:20:19 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2016-08-03 23:40:36 +0200 |
commit | 1b6b24740e91cb6a3191728e0e2f01c4d475cc84 (patch) | |
tree | 6a424ce42daf2e68b51f4ed2bc0e0103398e6b7e | |
parent | e17de45075f75cf9657764c31a7893dd73a1822f (diff) | |
download | scummvm-rg350-1b6b24740e91cb6a3191728e0e2f01c4d475cc84.tar.gz scummvm-rg350-1b6b24740e91cb6a3191728e0e2f01c4d475cc84.tar.bz2 scummvm-rg350-1b6b24740e91cb6a3191728e0e2f01c4d475cc84.zip |
DIRECTOR: Add cast info loading
-rw-r--r-- | engines/director/score.cpp | 55 | ||||
-rw-r--r-- | engines/director/score.h | 10 |
2 files changed, 64 insertions, 1 deletions
diff --git a/engines/director/score.cpp b/engines/director/score.cpp index d8d76ffb66..59e3f9e507 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -58,6 +58,15 @@ Score::Score(Archive &movie) { if (_movieArchive->hasResource(MKTAG('M','C','N','M'), 0)) { debug("Mac name %s", _movieArchive->getName(MKTAG('M','C','N','M'), 0).c_str()); } + + + Common::Array<uint16> vwci = _movieArchive->getResourceIDList(MKTAG('V','W','C','I')); + if (vwci.size() > 0) { + Common::Array<uint16>::iterator iterator; + for (iterator = vwci.begin(); iterator != vwci.end(); ++iterator) + loadCastInfo(*_movieArchive->getResource(MKTAG('V','W','C','I'), *iterator)); + } + DIBDecoder palette; Common::Array<uint16> clutList = _movieArchive->getResourceIDList(MKTAG('C','L','U','T')); @@ -218,6 +227,52 @@ void Score::loadActions(Common::SeekableReadStream &stream) { } } +void Score::loadCastInfo(Common::SeekableReadStream &stream) { + uint32 entryType = 0; + Common::Array<Common::String> castStrings = loadStrings(stream, entryType); + CastInfo ci; + ci.script = castStrings[0]; + ci.name = castStrings[1]; + ci.directory = castStrings[2]; + ci.fileName = castStrings[3]; + ci.type = castStrings[4]; + //TODO storage in array, and use this info +} + +Common::Array<Common::String> Score::loadStrings(Common::SeekableReadStream &stream, uint32 &entryType, bool hasHeader) { + Common::Array<Common::String> strings; + uint32 offset = 0; + if (hasHeader) { + offset = stream.readUint32BE(); + /*uint32 unk1 = */ stream.readUint32BE(); + /*uint32 unk2 = */ stream.readUint32BE(); + entryType = stream.readUint32BE(); + stream.seek(offset); + } + + uint16 count = stream.readUint16BE(); + offset += count * 2 + 16; //positions info + header info + uint32 startPos = stream.readUint32BE() + offset; + for (uint16 i = 0; i < count; i++) { + Common::String entryString; + uint32 nextPos = stream.readUint32BE() + offset; + uint32 streamPos = stream.pos(); + + stream.seek(startPos); + + while (startPos != nextPos) { + entryString += stream.readByte(); + ++startPos; + } + + strings.push_back(entryString); + + stream.seek(streamPos); + startPos = nextPos; + } + return strings; +} + BitmapCast::BitmapCast(Common::SeekableReadStream &stream) { /*byte flags = */ stream.readByte(); uint16 someFlaggyThing = stream.readUint16BE(); diff --git a/engines/director/score.h b/engines/director/score.h index 7c2a75fc7e..b8312df5dc 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -138,6 +138,13 @@ struct ButtonCast : TextCast { uint16 buttonType; }; +struct CastInfo { + Common::String script; + Common::String name; + Common::String directory; + Common::String fileName; + Common::String type; +}; class Sprite { public: @@ -198,7 +205,8 @@ private: void loadFrames(Common::SeekableReadStream &stream); void loadLabels(Common::SeekableReadStream &stream); void loadActions(Common::SeekableReadStream &stream); - + void loadCastInfo(Common::SeekableReadStream &stream); + Common::Array<Common::String> loadStrings(Common::SeekableReadStream &stream, uint32 &entryType, bool hasHeader = true); public: Common::Array<Frame *> _frames; Common::HashMap<int, Cast *> _casts; |