[Scummvm-git-logs] scummvm master -> 6f1508c9ad86687a681c69bb7d3755111377a49b
sev-
noreply at scummvm.org
Thu May 16 04:35:32 UTC 2024
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
e3212b4d11 DIRECTOR: Revert accidental changes
6f1508c9ad DIRECTOR: Initial plug in of script decompiler
Commit: e3212b4d11d9a2cb58a2216e064b9fca969f9fea
https://github.com/scummvm/scummvm/commit/e3212b4d11d9a2cb58a2216e064b9fca969f9fea
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-05-16T06:19:53+02:00
Commit Message:
DIRECTOR: Revert accidental changes
Changed paths:
engines/director/lingo/lingo.cpp
engines/director/movie.cpp
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 8c8ce36f24f..dc1ec563c00 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -336,8 +336,6 @@ Symbol Lingo::getHandler(const Common::String &name) {
if (_state->context && _state->context->_functionHandlers.contains(name))
return _state->context->_functionHandlers[name];
- warning("getHandler('%s'), movie is: %s", name.c_str(), g_director->getCurrentMovie()->getMacName().c_str());
-
sym = g_director->getCurrentMovie()->getHandler(name);
if (sym.type != VOIDSYM)
return sym;
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 1e673070114..7d16b72f052 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -607,23 +607,12 @@ ScriptContext *Movie::getScriptContext(ScriptType type, CastMemberID id) {
Symbol Movie::getHandler(const Common::String &name) {
for (auto &it : _casts) {
- if (name == "waitSignal") {
- for (auto &i : it._value->_lingoArchive->functionHandlers)
- debug("%s", i._key.c_str());
- }
-
if (it._value->_lingoArchive->functionHandlers.contains(name))
return it._value->_lingoArchive->functionHandlers[name];
}
- if (_sharedCast && _sharedCast->_lingoArchive->functionHandlers.contains(name)) {
- if (name == "waitSignal") {
- for (auto &i : _sharedCast->_lingoArchive->functionHandlers)
- debug("sh: %s", i._key.c_str());
- }
-
+ if (_sharedCast && _sharedCast->_lingoArchive->functionHandlers.contains(name))
return _sharedCast->_lingoArchive->functionHandlers[name];
- }
return Symbol();
}
Commit: 6f1508c9ad86687a681c69bb7d3755111377a49b
https://github.com/scummvm/scummvm/commit/6f1508c9ad86687a681c69bb7d3755111377a49b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-05-16T06:34:39+02:00
Commit Message:
DIRECTOR: Initial plug in of script decompiler
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 4767d3f2228..7f7394e295c 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -52,6 +52,11 @@
#include "director/castmember/transition.h"
#include "director/lingo/lingo-codegen.h"
+#include "director/lingo/lingodec/context.h"
+#include "director/lingo/lingodec/names.h"
+#include "director/lingo/lingodec/resolver.h"
+#include "director/lingo/lingodec/script.h"
+
namespace Director {
Cast::Cast(Movie *movie, uint16 castLibID, bool isShared, bool isExternal) {
@@ -115,6 +120,9 @@ Cast::~Cast() {
delete _loadedCast;
delete _lingoArchive;
+
+ delete _chunkResolver;
+ delete _lingodec;
}
CastMember *Cast::getCastMember(int castId, bool load) {
@@ -1120,6 +1128,51 @@ struct LingoContextEntry {
LingoContextEntry::LingoContextEntry(int32 i, int16 n)
: index(i), nextUnused(n), unused(false) {}
+class ChunkResolver : public LingoDec::ChunkResolver {
+public:
+ ChunkResolver(Cast *cast) : _cast(cast) {}
+ ~ChunkResolver() {
+ for (auto &it : _scripts)
+ delete it._value;
+
+ for (auto &it : _scriptnames)
+ delete it._value;
+ }
+
+ virtual LingoDec::Script *getScript(int32 id) {
+ if (_scripts.contains(id))
+ return _scripts[id];
+
+ Common::SeekableReadStreamEndian *r;
+
+ r = _cast->_castArchive->getResource(MKTAG('L', 's', 'c', 'r'), id);
+ _scripts[id] = new LingoDec::Script(_cast->_version);
+ _scripts[id]->read(*r);
+ delete r;
+
+ return _scripts[id];
+ }
+
+ virtual LingoDec::ScriptNames *getScriptNames(int32 id) {
+ if (_scriptnames.contains(id))
+ return _scriptnames[id];
+
+ Common::SeekableReadStreamEndian *r;
+
+ r = _cast->_castArchive->getResource(MKTAG('L', 'n', 'a', 'm'), id);
+ _scriptnames[id] = new LingoDec::ScriptNames(_cast->_version);
+ _scriptnames[id]->read(*r);
+ delete r;
+
+ return _scriptnames[id];
+ }
+
+private:
+ Cast *_cast;
+ Common::HashMap<int32, LingoDec::Script *> _scripts;
+ Common::HashMap<int32, LingoDec::ScriptNames *> _scriptnames;
+};
+
void Cast::loadLingoContext(Common::SeekableReadStreamEndian &stream) {
if (_version >= kFileVer400) {
debugC(1, kDebugCompile, "Add D4 script context");
@@ -1210,6 +1263,21 @@ void Cast::loadLingoContext(Common::SeekableReadStreamEndian &stream) {
} else {
error("Cast::loadLingoContext: unsupported Director version (%d)", _version);
}
+
+#if 0
+ // Rewind stream
+ stream.seek(0);
+ _chunkResolver = new ChunkResolver(this);
+ _lingodec = new LingoDec::ScriptContext(_version, _chunkResolver);
+ _lingodec->read(stream);
+
+ _lingodec->parseScripts();
+
+ for (auto it = _lingodec->scripts.begin(); it != _lingodec->scripts.end(); ++it) {
+ warning("%s", it->second->scriptText("\n", false).c_str());
+ }
+
+#endif
}
void Cast::loadScriptV2(Common::SeekableReadStreamEndian &stream, uint16 id) {
diff --git a/engines/director/cast.h b/engines/director/cast.h
index aa3eedc6f7f..3e1bbbc5ada 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -30,6 +30,11 @@ namespace Common {
class SeekableReadStreamEndian;
}
+namespace LingoDec {
+ class ChunkResolver;
+ struct ScriptContext;
+}
+
namespace Director {
class Archive;
@@ -166,6 +171,9 @@ public:
LingoArchive *_lingoArchive;
+ LingoDec::ScriptContext *_lingodec = nullptr;
+ LingoDec::ChunkResolver *_chunkResolver = nullptr;
+
private:
DirectorEngine *_vm;
Lingo *_lingo;
More information about the Scummvm-git-logs
mailing list