[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