[Scummvm-git-logs] scummvm master -> 339af7ef0e26541f9a5b16fcdeadaccf88fb5360
djsrv
dservilla at gmail.com
Tue Jul 14 20:35:04 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
339af7ef0e DIRECTOR: LINGO: Handle more Lctx fields
Commit: 339af7ef0e26541f9a5b16fcdeadaccf88fb5360
https://github.com/scummvm/scummvm/commit/339af7ef0e26541f9a5b16fcdeadaccf88fb5360
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-14T16:34:41-04:00
Commit Message:
DIRECTOR: LINGO: Handle more Lctx fields
Changed paths:
engines/director/cast.cpp
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index ffeca72a29..e2ded0b95f 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -892,33 +892,51 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
stream.readUint16();
stream.readUint16();
stream.readUint16();
- stream.readUint16();
- uint16 itemCount = stream.readUint16();
- stream.readUint16();
- /*uint16 itemCount2 = */ stream.readUint16();
+ int32 itemCount = stream.readSint32();
+ /* int32 itemCount2 = */ stream.readSint32();
uint16 itemsOffset = stream.readUint16();
+ /* uint16 entrySize = */ stream.readUint16();
+ /* uint32 unk1 = */ stream.readUint32();
+ /* uint32 fileType = */ stream.readUint32();
+ /* uint32 unk2 = */ stream.readUint32();
+ /* uint32 nameTableId = */ stream.readUint32();
+ /* int16 validCount = */ stream.readSint16();
+ /* uint16 flags = */ stream.readUint16();
+ int16 firstUnused = stream.readSint16();
Common::Array<int16> lscr;
stream.seek(itemsOffset);
- for (uint16 i = 0; i < itemCount; i++) {
+ int16 skip = firstUnused;
+ for (int16 i = 1; i <= itemCount; i++) {
if (debugChannelSet(5, kDebugLoading)) {
debugC(5, kDebugLoading, "Context entry %d:", i);
stream.hexdump(0xc);
}
- stream.readUint16();
- stream.readUint16();
- stream.readUint16();
- int16 index = stream.readSint16();
- lscr.push_back(index);
- stream.readUint16();
- stream.readUint16();
+ stream.readUint32();
+ int32 index = stream.readSint32();
+ uint16 entryFlags = stream.readUint16();
+ int16 nextUnused = stream.readSint16();
+
+ // There are 2 ways to identify unused scripts:
+ // 1) entryFlags & (1 << 2)
+ // 2) The entry is in a linked list of unused scripts
+ if (i == skip) {
+ debugC(1, kDebugCompile, "Cast::loadLingoContext: Script %d is in unused list", i);
+ skip = nextUnused;
+ lscr.push_back(-1);
+ } else if (entryFlags & (1 << 2)) {
+ debugC(1, kDebugCompile, "Cast::loadLingoContext: Script %d has unused flag", i);
+ lscr.push_back(-1);
+ } else {
+ lscr.push_back(index);
+ }
}
- for (uint16 i = 0; i < lscr.size(); i++) {
+ for (int16 i = 0; i < (int16)lscr.size(); i++) {
if (lscr[i] >= 0) {
Common::SeekableSubReadStreamEndian *r;
- _lingoArchive->addCodeV4(*(r = _castArchive->getResource(MKTAG('L', 's', 'c', 'r'), lscr[i])), i, _macName);
+ _lingoArchive->addCodeV4(*(r = _castArchive->getResource(MKTAG('L', 's', 'c', 'r'), lscr[i])), i + 1, _macName);
delete r;
}
}
@@ -927,13 +945,13 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
for (Common::HashMap<int, CastMember *>::iterator it = _loadedCast->begin(); it != _loadedCast->end(); ++it) {
if (it->_value->_type == kCastLingoScript) {
ScriptCastMember *member = static_cast<ScriptCastMember *>(it->_value);
- if (!_lingoArchive->lctxContexts.contains(member->_id - 1)) {
- warning("%s %d has invalid script ID %d", scriptType2str(member->_scriptType), it->_key, member->_id);
+ if (!_lingoArchive->lctxContexts.contains(member->_id)) {
+ warning("Cast::loadLingoContext: %s %d has invalid script ID %d", scriptType2str(member->_scriptType), it->_key, member->_id);
continue;
}
- ScriptContext *script = _lingoArchive->lctxContexts[member->_id - 1];
- debugC(1, kDebugCompile, "Repairing script %d: %s %d -> %s %d", member->_id, scriptType2str(script->_scriptType), script->_id, scriptType2str(member->_scriptType), it->_key);
+ ScriptContext *script = _lingoArchive->lctxContexts[member->_id];
+ debugC(1, kDebugCompile, "Cast::loadLingoContext: Repairing script %d: %s %d -> %s %d", member->_id, scriptType2str(script->_scriptType), script->_id, scriptType2str(member->_scriptType), it->_key);
script->_scriptType = member->_scriptType;
script->_id = it->_key;
}
@@ -944,7 +962,7 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
ScriptContext *script = it->_value;
if (!script->isFactory()) {
if (_lingoArchive->getScriptContext(script->_scriptType, script->_id)) {
- error("Script already defined for type %s, id %d", scriptType2str(script->_scriptType), script->_id);
+ error("Cast::loadLingoContext: Script already defined for type %s, id %d", scriptType2str(script->_scriptType), script->_id);
}
_lingoArchive->scriptContexts[script->_scriptType][script->_id] = script;
}
More information about the Scummvm-git-logs
mailing list