aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorScott Percival2019-11-10 22:30:48 +0800
committerEugene Sandulenko2019-11-17 22:31:54 +0100
commit2a8019be316ca5d57af2f5742f452d1ca338f8e2 (patch)
tree957b0781ca976cf2db207b4bcd16751ae59878fa /engines
parentcaf2a2301c9d14347442b9738e801cd0c171b580 (diff)
downloadscummvm-rg350-2a8019be316ca5d57af2f5742f452d1ca338f8e2.tar.gz
scummvm-rg350-2a8019be316ca5d57af2f5742f452d1ca338f8e2.tar.bz2
scummvm-rg350-2a8019be316ca5d57af2f5742f452d1ca338f8e2.zip
DIRECTOR: Add loader for Lingo name section.
Diffstat (limited to 'engines')
-rw-r--r--engines/director/lingo/lingo-bytecode.cpp34
-rw-r--r--engines/director/lingo/lingo.h2
-rw-r--r--engines/director/score.cpp53
-rw-r--r--engines/director/score.h1
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);