85 lines
2.2 KiB
C++
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
|