Files
scummvm-cursorfix/engines/director/lingo/lingodec/context.cpp
2026-02-02 04:50:13 +01:00

85 lines
2.2 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "common/stream.h"
#include "common/util.h"
#include "./context.h"
#include "./names.h"
#include "./resolver.h"
#include "./script.h"
namespace LingoDec {
struct ScriptContextMapEntry;
/* ScriptContext */
void ScriptContext::read(Common::SeekableReadStream &stream) {
// Lingo scripts are always big endian regardless of file endianness
unknown0 = stream.readSint32BE();
unknown1 = stream.readSint32BE();
entryCount = stream.readUint32BE();
entryCount2 = stream.readUint32BE();
entriesOffset = stream.readUint16BE();
unknown2 = stream.readSint16BE();
unknown3 = stream.readSint32BE();
unknown4 = stream.readSint32BE();
unknown5 = stream.readSint32BE();
lnamSectionID = stream.readSint32BE();
validCount = stream.readUint16BE();
flags = stream.readUint16BE();
freePointer = stream.readSint16BE();
stream.seek(entriesOffset);
sectionMap.resize(entryCount);
for (auto &entry : sectionMap) {
entry.read(stream);
}
lnam = resolver->getScriptNames(lnamSectionID);
for (uint32 i = 1; i <= entryCount; i++) {
auto section = sectionMap[i - 1];
if (section.sectionID > -1) {
Script *script = resolver->getScript(section.sectionID);
script->setContext(this);
scripts[i] = script;
}
}
for (auto it = scripts.begin(); it != scripts.end(); ++it) {
Script *script = it->second;
if (script->isFactory()) {
Script *parent = scripts[script->parentNumber + 1];
parent->factories.push_back(script);
}
}
}
bool ScriptContext::validName(int id) const {
return lnam->validName(id);
}
Common::String ScriptContext::getName(int id) const {
return lnam->getName(id);
}
void ScriptContext::parseScripts() {
for (auto it = scripts.begin(); it != scripts.end(); ++it) {
it->second->parse();
}
}
/* ScriptContextMapEntry */
void ScriptContextMapEntry::read(Common::SeekableReadStream &stream) {
unknown0 = stream.readSint32BE();
sectionID = stream.readSint32BE();
unknown1 = stream.readUint16BE();
unknown2 = stream.readUint16BE();
}
} // namespace LingoDec