From d8a103d9e26f4d9ddb4b17f418559044b003343a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Wed, 8 Feb 2017 22:11:23 +0100 Subject: DIRECTOR: Lingo: Documented D4 "Predefined methods and special messages" Lingo --- engines/director/lingo/lingo-builtins.cpp | 37 +++++++++++++++++++------------ engines/director/lingo/lingo-codegen.cpp | 7 +++--- engines/director/lingo/lingo.cpp | 8 +++---- 3 files changed, 31 insertions(+), 21 deletions(-) (limited to 'engines/director/lingo') diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp index 92511b1448..03e1a86544 100644 --- a/engines/director/lingo/lingo-builtins.cpp +++ b/engines/director/lingo/lingo-builtins.cpp @@ -274,6 +274,22 @@ static const char *builtinFunctions[] = { 0 }; + +static const char *predefinedMethods[] = { + "mAtFrame", // D3 + "mDescribe", // D3 + "mDispose", // D3 + "mGet", // D3 + "mInstanceRespondsTo", // D3 + "mMessageList", // D3 + "mName", // D3 + "mNew", // D3 + "mPerform", // D3 + "mPut", // D3 + "mRespondsTo", // D3 + 0 +}; + void Lingo::initBuiltIns() { for (BuiltinProto *blt = builtins; blt->name; blt++) { Symbol *sym = new Symbol; @@ -299,6 +315,13 @@ void Lingo::initBuiltIns() { for (const char **b = twoWordBuiltins; *b; b++) _twoWordBuiltins[*b] = true; + + // Set predefined methods + for (const char **b = predefinedMethods; *b; b++) { + Symbol *s = g_lingo->lookupVar(*b, true, true); + s->type = SYMBOL; + s->u.s = new Common::String(*b); + } } void Lingo::printSTUBWithArglist(const char *funcname, int nargs) { @@ -1335,20 +1358,6 @@ void Lingo::b_factory(int nargs) { // This is intentionally empty } -// TODO: -// List of predefined methods in D3 -// mAtFrame -// mDescribe -// mDispose -// mGet -// mInstanceRespondsTo -// mMessageList -// mName -// mNew -// mPerform -// mPut -// mRespondsTo - void Lingo::factoryCall(Common::String &name, int nargs) { Common::String s("factoryCall: "); diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp index 65f2b2d11a..94fe7068a4 100644 --- a/engines/director/lingo/lingo-codegen.cpp +++ b/engines/director/lingo/lingo-codegen.cpp @@ -142,7 +142,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) { } Symbol *Lingo::lookupVar(const char *name, bool create, bool putInGlobalList) { - Symbol *sym; + Symbol *sym = nullptr; // Looking for the cast member constants if (_vm->getVersion() < 4) { // TODO: There could be a flag 'Allow Outdated Lingo' in Movie Info in D4 @@ -165,7 +165,7 @@ Symbol *Lingo::lookupVar(const char *name, bool create, bool putInGlobalList) { } } - if (!_localvars->contains(name)) { // Create variable if it was not defined + if (!_localvars || !_localvars->contains(name)) { // Create variable if it was not defined if (!create) return NULL; @@ -174,7 +174,8 @@ Symbol *Lingo::lookupVar(const char *name, bool create, bool putInGlobalList) { sym->type = VOID; sym->u.i = 0; - (*_localvars)[name] = sym; + if (_localvars) + (*_localvars)[name] = sym; if (putInGlobalList) { sym->global = true; diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index 9a92d2f2ac..0ce1944c74 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -91,10 +91,6 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) { _eventHandlerTypes[t->handler] = t->name; } - initBuiltIns(); - initFuncs(); - initTheEntities(); - _currentScript = 0; _currentScriptType = kMovieScript; _currentEntityId = 0; @@ -119,6 +115,10 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) { _localvars = NULL; + initBuiltIns(); + initFuncs(); + initTheEntities(); + warning("Lingo Inited"); } -- cgit v1.2.3