Initial commit
This commit is contained in:
84
engines/director/lingo/lingodec/context.cpp
Normal file
84
engines/director/lingo/lingodec/context.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* 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
|
||||
Reference in New Issue
Block a user