[Scummvm-git-logs] scummvm master -> 83ca637d2463932993453160e9e7a6f7f4e63525

sev- sev at scummvm.org
Sun May 24 15:18:05 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
83ca637d24 DIRECTOR: Dump Lscr scripts with --dump-scripts


Commit: 83ca637d2463932993453160e9e7a6f7f4e63525
    https://github.com/scummvm/scummvm/commit/83ca637d2463932993453160e9e7a6f7f4e63525
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-05-24T17:16:46+02:00

Commit Message:
DIRECTOR: Dump Lscr scripts with --dump-scripts

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/resource.cpp
    engines/director/score.cpp
    engines/director/util.cpp
    engines/director/util.h


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 9e898d1532..d4c727620c 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -20,9 +20,13 @@
  *
  */
 
+#include "common/config-manager.h"
+#include "common/file.h"
 #include "common/substream.h"
 
 #include "director/director.h"
+#include "director/score.h"
+#include "director/util.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-builtins.h"
@@ -959,6 +963,18 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
 	byte *codeStore = (byte *)malloc(codeStoreSize);
 	stream.read(codeStore, codeStoreSize);
 
+	Common::DumpFile out;
+	bool skipdump = false;
+
+	if (ConfMan.getBool("dump_scripts")) {
+		Common::String buf = dumpScriptName(_vm->getCurrentScore()->getMacName().c_str(), type, id, "lscr");
+
+		if (!out.open(buf)) {
+			warning("Can not open dump file %s", buf.c_str());
+			skipdump = true;
+		}
+	}
+
 	// read each entry in the function table.
 	stream.seek(functionsOffset);
 	for (uint16 i = 0; i < functionsCount; i++) {
@@ -1233,6 +1249,22 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
 			sym->nargs = argCount;
 			sym->maxArgs = argCount;
 		}
+
+		if (!skipdump && ConfMan.getBool("dump_scripts")) {
+			if (nameIndex < _archives[_archiveIndex].names.size())
+				out.writeString(Common::String::format("function %s, %d args\n", _archives[_archiveIndex].names[nameIndex].c_str(), argCount));
+			else
+				out.writeString(Common::String::format("<noname>, %d args\n", argCount));
+
+			uint pc = 0;
+			while (pc < _currentScript->size()) {
+				uint spc = pc;
+				Common::String instr = decodeInstruction(_currentScript, pc, &pc);
+				out.writeString(Common::String::format("[%5d] %s\n", spc, instr.c_str()));
+			}
+			out.writeString(Common::String::format("<end code>\n\n"));
+		}
+
 		sym->argNames = argNames;
 		sym->varNames = varNames;
 		sym->ctx = _currentScriptContext;
@@ -1241,6 +1273,11 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
 
 	}
 
+	if (!skipdump && ConfMan.getBool("dump_scripts")) {
+		out.flush();
+		out.close();
+	}
+
 	free(codeStore);
 }
 
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index e0921e89c4..b80e4b9130 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -112,6 +112,8 @@ void DirectorEngine::loadEXE(const Common::String movie) {
 			error("Unhandled Windows EXE version %d", getVersion());
 		}
 	}
+
+	_mainArchive->setFileName(movie);
 }
 
 void DirectorEngine::loadEXEv3(Common::SeekableReadStream *stream) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index efdc416327..2cba2c8c34 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1250,37 +1250,10 @@ void Score::setStartToLabel(Common::String label) {
 
 void Score::dumpScript(const char *script, ScriptType type, uint16 id) {
 	Common::DumpFile out;
-	Common::String typeName;
-	char buf[256];
-
-	switch (type) {
-	case kNoneScript:
-	default:
-		error("Incorrect dumpScript() call (type %d)", type);
-	case kFrameScript:
-		typeName = "frame";
-		break;
-	case kMovieScript:
-		typeName = "movie";
-		break;
-	case kSpriteScript:
-		typeName = "sprite";
-		break;
-	case kCastScript:
-		typeName = "cast";
-		break;
-	case kGlobalScript:
-		typeName = "global";
-		break;
-	case kScoreScript:
-		typeName = "score";
-		break;
-	}
-
-	sprintf(buf, "./dumps/%s-%s-%d.txt", _macName.c_str(), typeName.c_str(), id);
+	Common::String buf = dumpScriptName(_macName.c_str(), type, id, "txt");
 
 	if (!out.open(buf)) {
-		warning("Can not open dump file %s", buf);
+		warning("Can not open dump file %s", buf.c_str());
 		return;
 	}
 
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index a2b0571d02..4b806afc71 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -380,4 +380,35 @@ Common::String convertMacFilename(const char *name) {
 	return res;
 }
 
+Common::String dumpScriptName(const char *prefix, int type, int id, const char *ext) {
+	Common::String typeName;
+
+	switch (type) {
+	case kNoneScript:
+	default:
+		error("dumpScriptName(): Incorrect call (type %d)", type);
+	case kFrameScript:
+		typeName = "frame";
+		break;
+	case kMovieScript:
+		typeName = "movie";
+		break;
+	case kSpriteScript:
+		typeName = "sprite";
+		break;
+	case kCastScript:
+		typeName = "cast";
+		break;
+	case kGlobalScript:
+		typeName = "global";
+		break;
+	case kScoreScript:
+		typeName = "score";
+		break;
+	}
+
+	return Common::String::format("./dumps/%s-%s-%d.%s", prefix, typeName.c_str(), id, ext);
+}
+
+
 } // End of namespace Director
diff --git a/engines/director/util.h b/engines/director/util.h
index 6b2ceb3ad1..9baacd3c15 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -44,6 +44,8 @@ Common::String stripMacPath(const char *name);
 
 Common::String convertMacFilename(const char *name);
 
+Common::String dumpScriptName(const char *prefix, int type, int id, const char *ext);
+
 bool processQuitEvent(bool click = false); // events.cpp
 
 } // End of namespace Director




More information about the Scummvm-git-logs mailing list