diff options
-rw-r--r-- | engines/director/lingo/lingo-bytecode.cpp | 34 | ||||
-rw-r--r-- | engines/director/lingo/lingo.h | 2 | ||||
-rw-r--r-- | engines/director/score.cpp | 53 | ||||
-rw-r--r-- | engines/director/score.h | 1 |
4 files changed, 72 insertions, 18 deletions
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp index af3ae68efe..fcc2236a67 100644 --- a/engines/director/lingo/lingo-bytecode.cpp +++ b/engines/director/lingo/lingo-bytecode.cpp @@ -68,6 +68,8 @@ void Lingo::initBytecode() { } + + void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType type, uint16 id) { debugC(1, kDebugLingoCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(type), id); @@ -278,4 +280,36 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty free(code_store); } + +void Lingo::addNamesV4(Common::SeekableSubReadStreamEndian &stream) { + debugC(1, kDebugLingoCompile, "Add V4 script name index"); + + // read the Lnam header! + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + stream.readUint16(); + uint16 offset = stream.readUint16(); + uint16 count = stream.readUint16(); + + stream.seek(offset); + + _namelist.clear(); + + Common::Array<Common::String> names; + for (uint32 i = 0; i < count; i++) { + uint8 size = stream.readByte(); + Common::String name; + for (uint8 j = 0; j < size; j++) { + name += stream.readByte(); + } + _namelist.push_back(name); + } + +} + } diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h index 35507e111c..bae1fbb724 100644 --- a/engines/director/lingo/lingo.h +++ b/engines/director/lingo/lingo.h @@ -176,6 +176,7 @@ public: void addCode(const char *code, ScriptType type, uint16 id); void addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType type, uint16 id); + void addNamesV4(Common::SeekableSubReadStreamEndian &stream); void executeScript(ScriptType type, uint16 id, uint16 function); void printStack(const char *s); Common::String decodeInstruction(uint pc, uint *newPC = NULL); @@ -551,6 +552,7 @@ public: TheEntityHash _theEntities; TheEntityFieldHash _theEntityFields; Common::Array<int> _labelstack; + Common::Array<Common::String> _namelist; SymbolHash _builtins; Common::HashMap<Common::String, bool> _twoWordBuiltins; diff --git a/engines/director/score.cpp b/engines/director/score.cpp index f0b6d39c11..cc33d470b4 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -180,18 +180,29 @@ void Score::loadArchive() { setSpriteCasts(); loadSpriteImages(false); - // Try to load compiled Lingo scripts - if (_vm->getVersion() == 4) { - Common::Array<uint16> lscr = _movieArchive->getResourceIDList(MKTAG('L','s','c','r')); - if (lscr.size() > 0) { - debugC(2, kDebugLoading, "****** Loading %d Lscr resources", lscr.size()); - - for (Common::Array<uint16>::iterator iterator = lscr.begin(); iterator != lscr.end(); ++iterator) { - loadLingoScript(*_movieArchive->getResource(MKTAG('L','s','c','r'), *iterator)); + // Try to load script name lists + if (_vm->getVersion() == 4) { + Common::Array<uint16> lnam = _movieArchive->getResourceIDList(MKTAG('L','n','a','m')); + if (lnam.size() > 0) { + debugC(2, kDebugLoading, "****** Loading %d Lnam resources", lnam.size()); + + for (Common::Array<uint16>::iterator iterator = lnam.begin(); iterator != lnam.end(); ++iterator) { + loadLingoNames(*_movieArchive->getResource(MKTAG('L','n','a','m'), *iterator)); } - } + } + } - } + // Try to load compiled Lingo scripts + if (_vm->getVersion() == 4) { + Common::Array<uint16> lscr = _movieArchive->getResourceIDList(MKTAG('L','s','c','r')); + if (lscr.size() > 0) { + debugC(2, kDebugLoading, "****** Loading %d Lscr resources", lscr.size()); + + for (Common::Array<uint16>::iterator iterator = lscr.begin(); iterator != lscr.end(); ++iterator) { + loadLingoScript(*_movieArchive->getResource(MKTAG('L','s','c','r'), *iterator)); + } + } + } // Try to load movie script, it sits in resource A11 if (_vm->getVersion() <= 3) { @@ -885,15 +896,21 @@ bool Score::processImmediateFrameScript(Common::String s, int id) { return false; } +void Score::loadLingoNames(Common::SeekableSubReadStreamEndian &stream) { + if (_vm->getVersion() == 4) { + _lingo->addNamesV4(stream); + } else { + error("Score::loadLingoNames: unsuported Director version (%d)", _vm->getVersion()); + } +} + void Score::loadLingoScript(Common::SeekableSubReadStreamEndian &stream) { - if (_vm->getVersion() == 4) { - - _lingo->addCodeV4(stream, kMovieScript, _movieScriptCount); - - } else { - error("Score::loadLingoScript: unsuported Director version (%d)", _vm->getVersion()); - } - _movieScriptCount++; + if (_vm->getVersion() == 4) { + _lingo->addCodeV4(stream, kMovieScript, _movieScriptCount); + } else { + error("Score::loadLingoScript: unsuported Director version (%d)", _vm->getVersion()); + } + _movieScriptCount++; } void Score::loadScriptText(Common::SeekableSubReadStreamEndian &stream) { diff --git a/engines/director/score.h b/engines/director/score.h index 7c663d559e..271b5ead61 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -101,6 +101,7 @@ private: void loadFrames(Common::SeekableSubReadStreamEndian &stream); void loadLabels(Common::SeekableSubReadStreamEndian &stream); void loadActions(Common::SeekableSubReadStreamEndian &stream); + void loadLingoNames(Common::SeekableSubReadStreamEndian &stream); void loadLingoScript(Common::SeekableSubReadStreamEndian &stream); void loadScriptText(Common::SeekableSubReadStreamEndian &stream); void loadFileInfo(Common::SeekableSubReadStreamEndian &stream); |