[Scummvm-git-logs] scummvm master -> e4caa3d51401b976d9e185efb56f83dfc7622e98

djsrv dservilla at gmail.com
Mon Jul 20 21:13:58 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:
e4caa3d514 DIRECTOR: LINGO: Fixed shared cast patching


Commit: e4caa3d51401b976d9e185efb56f83dfc7622e98
    https://github.com/scummvm/scummvm/commit/e4caa3d51401b976d9e185efb56f83dfc7622e98
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-20T17:13:07-04:00

Commit Message:
DIRECTOR: LINGO: Fixed shared cast patching

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-patcher.cpp
    engines/director/lingo/lingo-preprocessor.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/stxt.cpp
    engines/director/stxt.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 4f1194f001..941772359e 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -67,7 +67,7 @@ Cast::Cast(Movie *movie, bool isShared) {
 
 	_isShared = isShared;
 
-	_lingoArchive = new LingoArchive;
+	_lingoArchive = new LingoArchive(this);
 
 	_movieScriptCount = 0;
 	_castArrayStart = _castArrayEnd = 0;
@@ -328,7 +328,7 @@ bool Cast::loadArchive() {
 
 	for (Common::Array<uint16>::iterator iterator = stxt.begin(); iterator != stxt.end(); ++iterator) {
 		_loadedStxts->setVal(*iterator - _castIDoffset,
-				 new Stxt(*(r = _castArchive->getResource(MKTAG('S','T','X','T'), *iterator))));
+				 new Stxt(this, *(r = _castArchive->getResource(MKTAG('S','T','X','T'), *iterator))));
 
 		delete r;
 
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 6ca998db4a..14e2914b7f 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -54,6 +54,7 @@ public:
 	bool loadArchive();
 	void setArchive(Archive *archive);
 	Archive *getArchive() const { return _castArchive; };
+	Common::String getMacName() const { return _macName; }
 
 	void loadConfig(Common::SeekableSubReadStreamEndian &stream);
 	void loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream);
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 8dd0093aac..9d3d67052f 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1564,7 +1564,7 @@ void LB::b_installMenu(int nargs) {
 		return;
 	}
 
-	Common::String menuStxt = g_lingo->codePreprocessor(stxt->_ptext.c_str(), kNoneScript, castId, true);
+	Common::String menuStxt = g_lingo->codePreprocessor(stxt->_ptext.c_str(), stxt->_cast->_lingoArchive, kNoneScript, castId, true);
 	Common::String line;
 	int linenum = -1; // We increment it before processing
 
diff --git a/engines/director/lingo/lingo-patcher.cpp b/engines/director/lingo/lingo-patcher.cpp
index 9a218463cd..3a891e8a6b 100644
--- a/engines/director/lingo/lingo-patcher.cpp
+++ b/engines/director/lingo/lingo-patcher.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "director/director.h"
+#include "director/cast.h"
 #include "director/movie.h"
 #include "director/lingo/lingo.h"
 
@@ -52,7 +53,7 @@ struct ScriptPatch {
 			5, "end if", ""},
 
 	// Missing '&'
-	{"warlock", kPlatformMacintosh, "DATA/NAV/A1 Reactor", kMovieScript, 1,
+	{"warlock", kPlatformMacintosh, "DATA/NAV/Shared Cast", kMovieScript, 1,
 			19, "alert \"Failed Save.\" & return & \"Error message number: \" string ( filer )",
 				"alert \"Failed Save.\" & return & \"Error message number: \" & string ( filer )"},
 
@@ -69,7 +70,7 @@ struct ScriptPatch {
 			5, "end if", ""},
 
 	// Missing '&'
-	{"warlock", kPlatformWindows, "NAV/A1 Reactor", kMovieScript, 0,
+	{"warlock", kPlatformWindows, "NAV/Shared Cast", kMovieScript, 0,
 			23, "alert \"Failed Save.\" & return & \"Error message number: \" string ( filer )",
 				"alert \"Failed Save.\" & return & \"Error message number: \" & string ( filer )"},
 
@@ -83,12 +84,12 @@ struct ScriptPatch {
 	{nullptr, kPlatformUnknown, nullptr, kNoneScript, 0, 0, nullptr, nullptr}
 };
 
-Common::String Lingo::patchLingoCode(Common::String &line, ScriptType type, uint16 id, int linenum) {
-	if (!_vm->getCurrentMovie())
+Common::String Lingo::patchLingoCode(Common::String &line, LingoArchive *archive, ScriptType type, uint16 id, int linenum) {
+	if (!archive)
 		return line;
 
 	const ScriptPatch *patch = scriptPatches;
-	Common::String movie = _vm->getCurrentPath() + _vm->getCurrentMovie()->getMacName();
+	Common::String movie = _vm->getCurrentPath() + archive->cast->getMacName();
 
 	// So far, we have not many patches, so do linear lookup
 	while (patch->gameId) {
diff --git a/engines/director/lingo/lingo-preprocessor.cpp b/engines/director/lingo/lingo-preprocessor.cpp
index 050d2a6555..94b49c8782 100644
--- a/engines/director/lingo/lingo-preprocessor.cpp
+++ b/engines/director/lingo/lingo-preprocessor.cpp
@@ -126,7 +126,7 @@ static const char *findtokstart(const char *start, const char *token) {
 	return ptr;
 }
 
-Common::String Lingo::codePreprocessor(const char *s, ScriptType type, uint16 id, bool simple) {
+Common::String Lingo::codePreprocessor(const char *s, LingoArchive *archive, ScriptType type, uint16 id, bool simple) {
 	Common::String res;
 
 	// We start from processing the continuation synbols
@@ -237,7 +237,7 @@ Common::String Lingo::codePreprocessor(const char *s, ScriptType type, uint16 id
 			}
 		}
 
-		res1 = patchLingoCode(res1, type, id, linenumber);
+		res1 = patchLingoCode(res1, archive, type, id, linenumber);
 
 		bool changed = false;
 		res1 = preprocessWhen(res1, &changed);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 203742f902..7600fe8414 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -269,8 +269,8 @@ const char *Lingo::findNextDefinition(const char *s) {
 }
 
 void LingoArchive::addCode(const char *code, 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);
+	debugC(1, kDebugCompile, "Add code for type %s(%d) with id %d in '%s%s'\n"
+			"***********\n%s\n\n***********", scriptType2str(type), type, id, g_director->getCurrentPath().c_str(), cast->getMacName().c_str(), code);
 
 	if (getScriptContext(type, id)) {
 		// We can't undefine context data because it could be used in e.g. symbols.
@@ -318,7 +318,7 @@ ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, Scri
 	}
 
 	// Preprocess the code for ease of the parser
-	Common::String codeNorm = codePreprocessor(code, type, id);
+	Common::String codeNorm = codePreprocessor(code, archive, type, id);
 	code = codeNorm.c_str();
 	begin = code;
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index c395cf77cd..4758a7bc4a 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -201,8 +201,10 @@ struct LingoEvent {
 
 
 struct LingoArchive {
+	LingoArchive(Cast *c) : cast(c) {};
 	~LingoArchive();
 
+	Cast *cast;
 	ScriptContextHash lctxContexts;
 	ScriptContextHash scriptContexts[kMaxScriptType + 1];
 	Common::Array<Common::String> names;
@@ -251,10 +253,10 @@ public:
 
 	// lingo-preprocessor.cpp
 public:
-	Common::String codePreprocessor(const char *s, ScriptType type, uint16 id, bool simple = false);
+	Common::String codePreprocessor(const char *s, LingoArchive *archive, ScriptType type, uint16 id, bool simple = false);
 
 	// lingo-patcher.cpp
-	Common::String patchLingoCode(Common::String &line, ScriptType type, uint16 id, int linenumber);
+	Common::String patchLingoCode(Common::String &line, LingoArchive *archive, ScriptType type, uint16 id, int linenumber);
 
 	// lingo.cpp
 private:
diff --git a/engines/director/stxt.cpp b/engines/director/stxt.cpp
index 5c11ed5a40..199cc2dd1a 100644
--- a/engines/director/stxt.cpp
+++ b/engines/director/stxt.cpp
@@ -27,7 +27,7 @@
 
 namespace Director {
 
-Stxt::Stxt(Common::SeekableSubReadStreamEndian &textStream) {
+Stxt::Stxt(Cast *cast, Common::SeekableSubReadStreamEndian &textStream) : _cast(cast) {
 	// TODO: Side effects on textStream make this a little hard to understand in context?
 
 	_textType = kTextTypeFixed;
diff --git a/engines/director/stxt.h b/engines/director/stxt.h
index e771bf95ec..03829e354d 100644
--- a/engines/director/stxt.h
+++ b/engines/director/stxt.h
@@ -47,9 +47,10 @@ struct FontStyle {
 
 class Stxt {
 public:
-	Stxt(Common::SeekableSubReadStreamEndian &textStream);
+	Stxt(Cast *cast, Common::SeekableSubReadStreamEndian &textStream);
 
 public:
+	Cast *_cast;
 	Common::String _ftext;
 	Common::String _ptext;
 	TextType _textType;




More information about the Scummvm-git-logs mailing list