[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