[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