diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp index 301d5a0a425..e8df264829e 100644 --- a/engines/director/lingo/lingo-bytecode.cpp +++ b/engines/director/lingo/lingo-bytecode.cpp @@ -738,7 +738,7 @@ void LC::cb_zeropush() { g_lingo->push(d); } -void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &archName) { +void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName) { debugC(1, kDebugCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(type), id); if (getScriptContext(archiveIndex, type, id)) { @@ -752,6 +752,8 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn _assemblyContext = new ScriptContext; _archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext; + _assemblyContext->name = !scriptName.empty() ? scriptName : Common::String::format("%d", id); + if (stream.size() < 0x5c) { warning("Lscr header too small"); return; diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index 988fe821ade..30ec24f2aa1 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -253,7 +253,7 @@ const char *Lingo::findNextDefinition(const char *s) { return NULL; } -ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id) { +ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName) { debugC(1, kDebugCompile, "Add code for type %s(%d) with id %d\n" "***********\n%s\n\n***********", scriptType2str(type), type, id, code); @@ -270,6 +270,11 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ if (archiveIndex >= 0) _archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext; + if (scriptName && strlen(scriptName) > 0) + _assemblyContext->name = Common::String(scriptName); + else + _assemblyContext->name = Common::String::format("%d", id); + _methodVars = new Common::HashMap(); _linenumber = _colnumber = 1; _hadError = false; @@ -355,15 +360,8 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ currentFunc.type = HANDLER; currentFunc.u.defn = _currentAssembly; - // guess the name. don't actually bind it to the event, there's a seperate - // triggering mechanism for that. - if (type == kScoreScript) { - currentFunc.name = new Common::String("[score script]"); - } else if (type == kCastScript) { - currentFunc.name = new Common::String("[cast script"); - } else { - currentFunc.name = new Common::String("[unknown]"); - } + Common::String typeStr = Common::String(scriptType2str(type)); + currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->name + "]"); currentFunc.ctx = _currentScriptContext; currentFunc.archiveIndex = _assemblyArchive; // arg names should be empty, but just in case diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h index 4fae571de7a..a80e67f88ff 100644 --- a/engines/director/lingo/lingo.h +++ b/engines/director/lingo/lingo.h @@ -214,6 +214,7 @@ typedef Common::HashMap TheEntityFieldHash; struct ScriptContext { + Common::String name; Common::Array functions; // used only by bytecode Common::HashMap eventHandlers; SymbolHash functionHandlers; @@ -315,8 +316,8 @@ public: void restartLingo(bool keepSharedCast); - ScriptContext *addCode(const char *code, int archiveIndex, ScriptType type, uint16 id); - void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &archName); + ScriptContext *addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName = nullptr); + void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName); void addNamesV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex); void executeHandler(const Common::String &name); void executeScript(ScriptType type, uint16 id); diff --git a/engines/director/score-loading.cpp b/engines/director/score-loading.cpp index 15247b3ae7c..f94006443e6 100644 --- a/engines/director/score-loading.cpp +++ b/engines/director/score-loading.cpp @@ -873,7 +873,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id, if (scriptId < _castScriptIds.size()) { int resourceId = _castScriptIds[scriptId]; Common::SeekableSubReadStreamEndian *r; - _lingo->addCodeV4(*(r = _movieArchive->getResource(MKTAG('L', 's', 'c', 'r'), resourceId)), _lingoArchive, ((ScriptCast *)member)->_scriptType, id, _macName); + _lingo->addCodeV4(*(r = _movieArchive->getResource(MKTAG('L', 's', 'c', 'r'), resourceId)), _lingoArchive, ((ScriptCast *)member)->_scriptType, id, ci->name, _macName); delete r; } else { warning("Score::loadCastData(): Lingo context missing a resource entry for script %d referenced in cast %d", scriptId, id); @@ -889,7 +889,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id, if (ConfMan.getBool("dump_scripts")) dumpScript(ci->script.c_str(), scriptType, id); - _lingo->addCode(ci->script.c_str(), _lingoArchive, scriptType, id); + _lingo->addCode(ci->script.c_str(), _lingoArchive, scriptType, id, ci->name.c_str()); } } @@ -1127,7 +1127,7 @@ void Score::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id) dumpScript(ci->script.c_str(), kCastScript, id); if (!ci->script.empty()) - _lingo->addCode(ci->script.c_str(), _lingoArchive, kCastScript, id); + _lingo->addCode(ci->script.c_str(), _lingoArchive, kCastScript, id, ci->name.c_str()); ci->name = getString(castStrings[1]); ci->directory = getString(castStrings[2]);