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

sev- sev at scummvm.org
Sat Jun 6 16:34:27 UTC 2020


This automated email contains information about 26 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
182402fdfa DIRECTOR: LINGO: Create and populate factory objs
041326bdd1 DIRECTOR: LINGO: Implement factory method calls
95a70de5c3 DIRECTOR: LINGO: Clean up LC::call
eef6fbe831 DIRECTOR: LINGO: Implement m_new
fddf6dd193 DIRECTOR: LINGO: Implement instance vars
ccba7503e0 DIRECTOR: LINGO: Implement me
e39fa92178 DIRECTOR: LINGO: Implement object array
c855e1ad6e DIRECTOR: LINGO: Add factory debugging
8274f76dee DIRECTOR: LINGO: Clean up factory code
5443cb2b32 DIRECTOR: LINGO: Fix user-defined mNew
964b3eddc2 DIRECTOR: LINGO: Implement m_dispose
f0e598e402 DIRECTOR: LINGO: Fix b_objectp
516d2ef17f DIRECTOR: LINGO: Implement kThePerFrameHook
4e4f26f963 DIRECTOR: LINGO: Fix var assign/fetch with obj val
47f19d8515 DIRECTOR: LINGO: Fix extra arg warning on method
5de9a9816e DIRECTOR: LINGO: Lazy evaluate first ID in arglist
99755d8cf5 DIRECTOR: LINGO: Improve object printing
68e6b915a3 DIRECTOR: LINGO: Fix vars in global scope
dbeabf0be3 DIRECTOR: LINGO: Fix lazy datum printing
ca9e952d41 DIRECTOR: LINGO: Implement Lingo::push/popContext
7549b819bb DIRECTOR: LINGO: Implement primary event handlers
759c53c868 DIRECTOR: LINGO: Call perFrameHook with arguments
be4c440128 DIRECTOR: LINGO: Remove legacy me code
2d9dea678a DIRECTOR: LINGO: Remove unnecessary instructions
2daf4721c9 DIRECTOR: LINGO: Implement b_factory
c01b88c2e8 DIRECTOR: LINGO: Clean up lingo-object.cpp


Commit: 182402fdfa35b01bb625329c98205b5715fce417
    https://github.com/scummvm/scummvm/commit/182402fdfa35b01bb625329c98205b5715fce417
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Create and populate factory objs

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 7ea255c577..da5dd4bb7f 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -224,7 +224,7 @@ void Lingo::cleanLocalVars() {
 	g_lingo->_localvars = nullptr;
 }
 
-Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::Array<Common::String> *argNames, Common::Array<Common::String> *varNames) {
+Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::Array<Common::String> *argNames, Common::Array<Common::String> *varNames, Object *factory) {
 	Symbol sym;
 	sym.name = new Common::String(name);
 	sym.type = HANDLER;
@@ -246,25 +246,29 @@ Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::
 		debugC(1, kDebugLingoCompile, "<end define code>");
 	}
 
-	Symbol existing = getHandler(name);
-	if (existing.type != VOID)
-		warning("Redefining handler '%s'", name.c_str());
-
-	if (!_eventHandlerTypeIds.contains(name)) {
-		_archives[_archiveIndex].functionHandlers[name] = sym;
+	if (factory != nullptr) {
+		if (factory->methods.contains(name)) {
+			warning("Redefining method '%s' on factory '%s'", name.c_str(), factory->name->c_str());
+		}
+		factory->methods[name] = sym;
 	} else {
-		_archives[_archiveIndex].eventHandlers[ENTITY_INDEX(_eventHandlerTypeIds[name.c_str()], _currentEntityId)] = sym;
+		Symbol existing = getHandler(name);
+		if (existing.type != VOID)
+			warning("Redefining handler '%s'", name.c_str());
+
+		if (!_eventHandlerTypeIds.contains(name)) {
+			_archives[_archiveIndex].functionHandlers[name] = sym;
+		} else {
+			_archives[_archiveIndex].eventHandlers[ENTITY_INDEX(_eventHandlerTypeIds[name.c_str()], _currentEntityId)] = sym;
+		}
 	}
 
 	return sym;
 }
 
-Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, Common::String *prefix, int end, bool removeCode) {
-	if (prefix)
-		name = *prefix + "-" + name;
-
+Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, Object *factory, int end, bool removeCode) {
 	debugC(1, kDebugLingoCompile, "codeDefine(\"%s\"(len: %d), %d, %d, \"%s\", %d) entity: %d",
-			name.c_str(), _currentScript->size() - 1, start, nargs, (prefix ? prefix->c_str() : ""),
+			name.c_str(), _currentScript->size() - 1, start, nargs, (factory ? factory->name->c_str() : ""),
 			end, _currentEntityId);
 
 	if (end == -1)
@@ -280,7 +284,7 @@ Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, Common::Str
 		if (it->_value == kVarLocal)
 			varNames->push_back(Common::String(it->_key));
 	}
-	Symbol sym = define(name, nargs, code, argNames, varNames);
+	Symbol sym = define(name, nargs, code, argNames, varNames, factory);
 
 	// Now remove all defined code from the _currentScript
 	if (removeCode)
@@ -375,30 +379,30 @@ int Lingo::codeFunc(Common::String *s, int numpar) {
 	return ret;
 }
 
-int Lingo::codeMe(Common::String *method, int numpar) {
-	// Check if need to encode reference to the factory
-	if (method == nullptr) {
-		int ret = g_lingo->code1(LC::c_factory);
-		g_lingo->codeString(g_lingo->_currentFactory.c_str());
+// int Lingo::codeMe(Common::String *method, int numpar) {
+// 	// Check if need to encode reference to the factory
+// 	if (method == nullptr) {
+// 		int ret = g_lingo->code1(LC::c_factory);
+// 		g_lingo->codeString(g_lingo->_currentFactory->name->c_str());
 
-		return ret;
-	}
+// 		return ret;
+// 	}
 
-	int ret = g_lingo->code1(LC::c_call);
+// 	int ret = g_lingo->code1(LC::c_call);
 
-	Common::String m(g_lingo->_currentFactory);
+// 	Common::String m(g_lingo->_currentFactory->name);
 
-	m += '-';
-	m += *method;
+// 	m += '-';
+// 	m += *method;
 
-	g_lingo->codeString(m.c_str());
+// 	g_lingo->codeString(m.c_str());
 
-	inst num = 0;
-	WRITE_UINT32(&num, numpar);
-	g_lingo->code1(num);
+// 	inst num = 0;
+// 	WRITE_UINT32(&num, numpar);
+// 	g_lingo->code1(num);
 
-	return ret;
-}
+// 	return ret;
+// }
 
 void Lingo::codeLabel(int label) {
 	_labelstack.push_back(label);
@@ -627,18 +631,23 @@ Datum Lingo::varFetch(Datum &var, bool global) {
 }
 
 void Lingo::codeFactory(Common::String &name) {
-	_currentFactory = name;
-
-	Symbol sym;
-
-	sym.name = new Common::String(name);
-	sym.type = BLTIN;
-	sym.nargs = -1;
-	sym.maxArgs = 0;
-	sym.parens = true;
-	sym.u.bltin = LB::b_factory;
-
-	_archives[_archiveIndex].eventHandlers[ENTITY_INDEX(_eventHandlerTypeIds[name.c_str()], _currentEntityId)] = sym;
+	Object *obj = new Object;
+	obj->name = new Common::String(name);
+	obj->type = kFactoryObj;
+	obj->inheritanceLevel = 1;
+	obj->scriptContext = _currentScriptContext;
+	obj->objArray = new DatumArray; 
+
+	_currentFactory = obj;
+	if (!_globalvars.contains(name)) {
+		_globalvars[name] = Symbol();
+		_globalvars[name].name = new Common::String(name);
+		_globalvars[name].global = true;
+		_globalvars[name].type = OBJECT;
+		_globalvars[name].u.obj = obj;
+	} else {
+		warning("Factory '%s' already defined", name.c_str());
+	}
 }
 
 }
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 0a13186a39..642e854eee 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.6.3.  */
+/* A Bison parser, made by GNU Bison 3.6.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -49,7 +49,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.6.3"
+#define YYBISON_VERSION "3.6.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -116,6 +116,17 @@ static void endDef() {
 	inNone();
 	g_lingo->_ignoreMe = false;
 
+	for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator i = g_lingo->_methodVars->begin(); i != g_lingo->_methodVars->end(); ++i) {
+		if (i->_value == kVarInstance) {
+			if (g_lingo->_currentFactory != nullptr) {
+				g_lingo->_currentFactory->properties[i->_key] = Symbol();
+				g_lingo->_currentFactory->properties[i->_key].name = new Common::String(i->_key);
+			} else {
+				warning("Instance var '%s' defined outside factory", i->_key.c_str());
+			}
+		}
+	}
+
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
 	g_lingo->_methodVarsStash = nullptr;
@@ -127,7 +138,7 @@ static void mVar(Common::String *s, VarType type) {
 }
 
 
-#line 131 "engines/director/lingo/lingo-gr.cpp"
+#line 142 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -264,7 +275,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 114 "engines/director/lingo/lingo-gr.y"
+#line 125 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -284,7 +295,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 288 "engines/director/lingo/lingo-gr.cpp"
+#line 299 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -834,27 +845,27 @@ static const yytype_int8 yytranslate[] =
 };
 
 #if YYDEBUG
-  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
+  /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   173,   173,   174,   176,   177,   178,   180,   187,   191,
-     202,   203,   204,   211,   218,   225,   232,   238,   245,   256,
-     263,   264,   265,   267,   268,   273,   285,   289,   292,   284,
-     316,   320,   323,   315,   349,   356,   362,   348,   390,   392,
-     395,   396,   398,   400,   407,   415,   416,   418,   424,   428,
-     432,   436,   439,   441,   442,   443,   445,   448,   451,   455,
-     459,   463,   471,   477,   478,   479,   490,   491,   492,   495,
-     498,   501,   504,   509,   515,   516,   517,   518,   519,   520,
-     521,   522,   523,   524,   525,   526,   527,   528,   529,   530,
-     531,   532,   533,   534,   535,   536,   537,   539,   540,   541,
-     542,   543,   544,   545,   546,   548,   551,   553,   554,   555,
-     556,   557,   558,   558,   559,   559,   560,   560,   561,   564,
-     567,   568,   570,   575,   581,   586,   592,   597,   610,   611,
-     612,   613,   617,   621,   626,   627,   629,   633,   637,   641,
-     641,   671,   671,   671,   677,   678,   678,   684,   692,   698,
-     698,   701,   702,   703,   705,   706,   707,   709,   711,   719,
-     720,   721,   723,   724,   726,   728,   729,   730,   731,   733,
-     734,   736,   737,   739,   743
+       0,   184,   184,   185,   187,   188,   189,   191,   198,   202,
+     213,   214,   215,   222,   229,   236,   243,   249,   256,   267,
+     274,   275,   276,   278,   279,   284,   296,   300,   303,   295,
+     327,   331,   334,   326,   360,   367,   373,   359,   401,   403,
+     406,   407,   409,   411,   418,   426,   427,   429,   435,   439,
+     443,   447,   450,   452,   453,   454,   456,   459,   462,   466,
+     470,   474,   482,   488,   489,   490,   501,   502,   503,   506,
+     509,   512,   515,   520,   526,   527,   528,   529,   530,   531,
+     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   550,   551,   552,
+     553,   554,   555,   556,   557,   559,   562,   564,   565,   566,
+     567,   568,   569,   569,   570,   570,   571,   571,   572,   575,
+     578,   579,   581,   586,   592,   597,   603,   606,   617,   618,
+     619,   620,   624,   628,   633,   634,   636,   640,   644,   648,
+     648,   678,   678,   678,   684,   685,   685,   691,   699,   705,
+     705,   708,   709,   710,   712,   713,   714,   716,   718,   726,
+     727,   728,   730,   731,   733,   735,   736,   737,   738,   740,
+     741,   743,   744,   746,   750
 };
 #endif
 
@@ -929,7 +940,7 @@ static const yytype_int16 yytoknum[] =
 #define yytable_value_is_error(Yyn) \
   0
 
-  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+  /* YYPACTSTATE-NUM -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
@@ -972,7 +983,7 @@ static const yytype_int16 yypact[] =
     -293,  1610,  -293
 };
 
-  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+  /* YYDEFACTSTATE-NUM -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
@@ -1016,7 +1027,7 @@ static const yytype_uint8 yydefact[] =
       29,     0,    33
 };
 
-  /* YYPGOTO[NTERM-NUM].  */
+  /* YYPGOTONTERM-NUM.  */
 static const yytype_int16 yypgoto[] =
 {
     -293,    85,  -293,  -293,   -47,    15,  -293,  -293,  -293,  -293,
@@ -1027,7 +1038,7 @@ static const yytype_int16 yypgoto[] =
       13,  -293,  -293,  -293,  -293,  -293,    16
 };
 
-  /* YYDEFGOTO[NTERM-NUM].  */
+  /* YYDEFGOTONTERM-NUM.  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,    45,    46,    47,    48,   308,   298,   324,   349,   299,
@@ -1038,7 +1049,7 @@ static const yytype_int16 yydefgoto[] =
      153,    77,    62,   121,   122,   123,   124
 };
 
-  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+  /* YYTABLEYYPACT[STATE-NUM] -- What to do in state STATE-NUM.  If
      positive, shift that token.  If negative, reduce the rule whose
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
@@ -1559,7 +1570,7 @@ static const yytype_int16 yycheck[] =
       88,    89,    90,    91,    92,    93,    94
 };
 
-  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+  /* YYSTOSSTATE-NUM -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
@@ -1602,7 +1613,7 @@ static const yytype_uint8 yystos[] =
       86,   127,    86
 };
 
-  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+  /* YYR1YYN -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
        0,   103,   104,   104,   105,   105,   105,   106,   106,   106,
@@ -1625,7 +1636,7 @@ static const yytype_uint8 yyr1[] =
      157,   158,   158,   159,   159
 };
 
-  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+  /* YYR2YYN -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_int8 yyr2[] =
 {
        0,     2,     1,     3,     0,     1,     1,     4,     4,     6,
@@ -1917,81 +1928,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1923 "engines/director/lingo/lingo-gr.cpp"
+#line 1934 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1929 "engines/director/lingo/lingo-gr.cpp"
+#line 1940 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1935 "engines/director/lingo/lingo-gr.cpp"
+#line 1946 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1941 "engines/director/lingo/lingo-gr.cpp"
+#line 1952 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1947 "engines/director/lingo/lingo-gr.cpp"
+#line 1958 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1953 "engines/director/lingo/lingo-gr.cpp"
+#line 1964 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1959 "engines/director/lingo/lingo-gr.cpp"
+#line 1970 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1965 "engines/director/lingo/lingo-gr.cpp"
+#line 1976 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1971 "engines/director/lingo/lingo-gr.cpp"
+#line 1982 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1977 "engines/director/lingo/lingo-gr.cpp"
+#line 1988 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1983 "engines/director/lingo/lingo-gr.cpp"
+#line 1994 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 169 "engines/director/lingo/lingo-gr.y"
+#line 180 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 1989 "engines/director/lingo/lingo-gr.cpp"
+#line 2000 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 147: /* on  */
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 179 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1995 "engines/director/lingo/lingo-gr.cpp"
+#line 2006 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2270,7 +2281,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 180 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2278,19 +2289,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2282 "engines/director/lingo/lingo-gr.cpp"
+#line 2293 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 187 "engines/director/lingo/lingo-gr.y"
+#line 198 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2290 "engines/director/lingo/lingo-gr.cpp"
+#line 2301 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 202 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2302,23 +2313,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2306 "engines/director/lingo/lingo-gr.cpp"
+#line 2317 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 202 "engines/director/lingo/lingo-gr.y"
+#line 213 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2312 "engines/director/lingo/lingo-gr.cpp"
+#line 2323 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 203 "engines/director/lingo/lingo-gr.y"
+#line 214 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2318 "engines/director/lingo/lingo-gr.cpp"
+#line 2329 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 204 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2326,11 +2337,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2330 "engines/director/lingo/lingo-gr.cpp"
+#line 2341 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 211 "engines/director/lingo/lingo-gr.y"
+#line 222 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2338,11 +2349,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2342 "engines/director/lingo/lingo-gr.cpp"
+#line 2353 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 218 "engines/director/lingo/lingo-gr.y"
+#line 229 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2350,11 +2361,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2354 "engines/director/lingo/lingo-gr.cpp"
+#line 2365 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 225 "engines/director/lingo/lingo-gr.y"
+#line 236 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2362,33 +2373,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2366 "engines/director/lingo/lingo-gr.cpp"
+#line 2377 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 232 "engines/director/lingo/lingo-gr.y"
+#line 243 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2377 "engines/director/lingo/lingo-gr.cpp"
+#line 2388 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 238 "engines/director/lingo/lingo-gr.y"
+#line 249 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2388 "engines/director/lingo/lingo-gr.cpp"
+#line 2399 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 245 "engines/director/lingo/lingo-gr.y"
+#line 256 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2400,54 +2411,54 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2404 "engines/director/lingo/lingo-gr.cpp"
+#line 2415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 256 "engines/director/lingo/lingo-gr.y"
+#line 267 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2415 "engines/director/lingo/lingo-gr.cpp"
+#line 2426 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 273 "engines/director/lingo/lingo-gr.y"
+#line 284 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-5].code) - (yyvsp[-1].code) + 1);
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2426 "engines/director/lingo/lingo-gr.cpp"
+#line 2437 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 285 "engines/director/lingo/lingo-gr.y"
+#line 296 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2434 "engines/director/lingo/lingo-gr.cpp"
+#line 2445 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 289 "engines/director/lingo/lingo-gr.y"
+#line 300 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2441 "engines/director/lingo/lingo-gr.cpp"
+#line 2452 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 292 "engines/director/lingo/lingo-gr.y"
+#line 303 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2447 "engines/director/lingo/lingo-gr.cpp"
+#line 2458 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 292 "engines/director/lingo/lingo-gr.y"
+#line 303 "engines/director/lingo/lingo-gr.y"
                                                                                           {
 
 		g_lingo->code1(LC::c_eval);
@@ -2466,32 +2477,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2470 "engines/director/lingo/lingo-gr.cpp"
+#line 2481 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 316 "engines/director/lingo/lingo-gr.y"
+#line 327 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2478 "engines/director/lingo/lingo-gr.cpp"
+#line 2489 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 320 "engines/director/lingo/lingo-gr.y"
+#line 331 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2485 "engines/director/lingo/lingo-gr.cpp"
+#line 2496 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 323 "engines/director/lingo/lingo-gr.y"
+#line 334 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2491 "engines/director/lingo/lingo-gr.cpp"
+#line 2502 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 324 "engines/director/lingo/lingo-gr.y"
+#line 335 "engines/director/lingo/lingo-gr.y"
                                                     {
 
 		g_lingo->code1(LC::c_eval);
@@ -2510,32 +2521,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2514 "engines/director/lingo/lingo-gr.cpp"
+#line 2525 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 349 "engines/director/lingo/lingo-gr.y"
+#line 360 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2525 "engines/director/lingo/lingo-gr.cpp"
+#line 2536 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 356 "engines/director/lingo/lingo-gr.y"
+#line 367 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2535 "engines/director/lingo/lingo-gr.cpp"
+#line 2546 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 362 "engines/director/lingo/lingo-gr.y"
+#line 373 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2546,11 +2557,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), kVarLocal);
 				  g_lingo->code1(LC::c_assign); }
-#line 2550 "engines/director/lingo/lingo-gr.cpp"
+#line 2561 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 372 "engines/director/lingo/lingo-gr.y"
+#line 383 "engines/director/lingo/lingo-gr.y"
                                             {
 
 		g_lingo->code1(LC::c_intpush);
@@ -2568,44 +2579,44 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2572 "engines/director/lingo/lingo-gr.cpp"
+#line 2583 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 390 "engines/director/lingo/lingo-gr.y"
+#line 401 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2579 "engines/director/lingo/lingo-gr.cpp"
+#line 2590 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 392 "engines/director/lingo/lingo-gr.y"
+#line 403 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2587 "engines/director/lingo/lingo-gr.cpp"
+#line 2598 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 395 "engines/director/lingo/lingo-gr.y"
+#line 406 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2593 "engines/director/lingo/lingo-gr.cpp"
+#line 2604 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 396 "engines/director/lingo/lingo-gr.y"
+#line 407 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2599 "engines/director/lingo/lingo-gr.cpp"
+#line 2610 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 398 "engines/director/lingo/lingo-gr.y"
+#line 409 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2605 "engines/director/lingo/lingo-gr.cpp"
+#line 2616 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 400 "engines/director/lingo/lingo-gr.y"
+#line 411 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2613,11 +2624,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2617 "engines/director/lingo/lingo-gr.cpp"
+#line 2628 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 407 "engines/director/lingo/lingo-gr.y"
+#line 418 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2625,107 +2636,107 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2629 "engines/director/lingo/lingo-gr.cpp"
+#line 2640 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 418 "engines/director/lingo/lingo-gr.y"
+#line 429 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2639 "engines/director/lingo/lingo-gr.cpp"
+#line 2650 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 424 "engines/director/lingo/lingo-gr.y"
+#line 435 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2647 "engines/director/lingo/lingo-gr.cpp"
+#line 2658 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 428 "engines/director/lingo/lingo-gr.y"
+#line 439 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2655 "engines/director/lingo/lingo-gr.cpp"
+#line 2666 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 432 "engines/director/lingo/lingo-gr.y"
+#line 443 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2663 "engines/director/lingo/lingo-gr.cpp"
+#line 2674 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 436 "engines/director/lingo/lingo-gr.y"
+#line 447 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2670 "engines/director/lingo/lingo-gr.cpp"
+#line 2681 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 439 "engines/director/lingo/lingo-gr.y"
+#line 450 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2676 "engines/director/lingo/lingo-gr.cpp"
+#line 2687 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 441 "engines/director/lingo/lingo-gr.y"
+#line 452 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2682 "engines/director/lingo/lingo-gr.cpp"
+#line 2693 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 445 "engines/director/lingo/lingo-gr.y"
+#line 456 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2690 "engines/director/lingo/lingo-gr.cpp"
+#line 2701 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 448 "engines/director/lingo/lingo-gr.y"
+#line 459 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2698 "engines/director/lingo/lingo-gr.cpp"
+#line 2709 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 451 "engines/director/lingo/lingo-gr.y"
+#line 462 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2707 "engines/director/lingo/lingo-gr.cpp"
+#line 2718 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 455 "engines/director/lingo/lingo-gr.y"
+#line 466 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2716 "engines/director/lingo/lingo-gr.cpp"
+#line 2727 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 459 "engines/director/lingo/lingo-gr.y"
+#line 470 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2725 "engines/director/lingo/lingo-gr.cpp"
+#line 2736 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 463 "engines/director/lingo/lingo-gr.y"
+#line 474 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2734,28 +2745,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2738 "engines/director/lingo/lingo-gr.cpp"
+#line 2749 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 471 "engines/director/lingo/lingo-gr.y"
+#line 482 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2749 "engines/director/lingo/lingo-gr.cpp"
+#line 2760 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 477 "engines/director/lingo/lingo-gr.y"
+#line 488 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2755 "engines/director/lingo/lingo-gr.cpp"
+#line 2766 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 479 "engines/director/lingo/lingo-gr.y"
+#line 490 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2766,531 +2777,527 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2770 "engines/director/lingo/lingo-gr.cpp"
+#line 2781 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 490 "engines/director/lingo/lingo-gr.y"
+#line 501 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2776 "engines/director/lingo/lingo-gr.cpp"
+#line 2787 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 503 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2784 "engines/director/lingo/lingo-gr.cpp"
+#line 2795 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 506 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2792 "engines/director/lingo/lingo-gr.cpp"
+#line 2803 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 498 "engines/director/lingo/lingo-gr.y"
+#line 509 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2800 "engines/director/lingo/lingo-gr.cpp"
+#line 2811 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 512 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2808 "engines/director/lingo/lingo-gr.cpp"
+#line 2819 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 504 "engines/director/lingo/lingo-gr.y"
+#line 515 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2818 "engines/director/lingo/lingo-gr.cpp"
+#line 2829 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 509 "engines/director/lingo/lingo-gr.y"
+#line 520 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2829 "engines/director/lingo/lingo-gr.cpp"
+#line 2840 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 516 "engines/director/lingo/lingo-gr.y"
+#line 527 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2835 "engines/director/lingo/lingo-gr.cpp"
+#line 2846 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 517 "engines/director/lingo/lingo-gr.y"
+#line 528 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2841 "engines/director/lingo/lingo-gr.cpp"
+#line 2852 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 529 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2847 "engines/director/lingo/lingo-gr.cpp"
+#line 2858 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 519 "engines/director/lingo/lingo-gr.y"
+#line 530 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2853 "engines/director/lingo/lingo-gr.cpp"
+#line 2864 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 520 "engines/director/lingo/lingo-gr.y"
+#line 531 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2859 "engines/director/lingo/lingo-gr.cpp"
+#line 2870 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 521 "engines/director/lingo/lingo-gr.y"
+#line 532 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2865 "engines/director/lingo/lingo-gr.cpp"
+#line 2876 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 522 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2871 "engines/director/lingo/lingo-gr.cpp"
+#line 2882 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 523 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2877 "engines/director/lingo/lingo-gr.cpp"
+#line 2888 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 524 "engines/director/lingo/lingo-gr.y"
+#line 535 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2883 "engines/director/lingo/lingo-gr.cpp"
+#line 2894 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 525 "engines/director/lingo/lingo-gr.y"
+#line 536 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2889 "engines/director/lingo/lingo-gr.cpp"
+#line 2900 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 526 "engines/director/lingo/lingo-gr.y"
+#line 537 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2895 "engines/director/lingo/lingo-gr.cpp"
+#line 2906 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2901 "engines/director/lingo/lingo-gr.cpp"
+#line 2912 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 528 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2907 "engines/director/lingo/lingo-gr.cpp"
+#line 2918 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 529 "engines/director/lingo/lingo-gr.y"
+#line 540 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2913 "engines/director/lingo/lingo-gr.cpp"
+#line 2924 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 530 "engines/director/lingo/lingo-gr.y"
+#line 541 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2919 "engines/director/lingo/lingo-gr.cpp"
+#line 2930 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 531 "engines/director/lingo/lingo-gr.y"
+#line 542 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2925 "engines/director/lingo/lingo-gr.cpp"
+#line 2936 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 532 "engines/director/lingo/lingo-gr.y"
+#line 543 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2931 "engines/director/lingo/lingo-gr.cpp"
+#line 2942 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 533 "engines/director/lingo/lingo-gr.y"
+#line 544 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2937 "engines/director/lingo/lingo-gr.cpp"
+#line 2948 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 534 "engines/director/lingo/lingo-gr.y"
+#line 545 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 2943 "engines/director/lingo/lingo-gr.cpp"
+#line 2954 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 546 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 2949 "engines/director/lingo/lingo-gr.cpp"
+#line 2960 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 547 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 2955 "engines/director/lingo/lingo-gr.cpp"
+#line 2966 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 537 "engines/director/lingo/lingo-gr.y"
+#line 548 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 2961 "engines/director/lingo/lingo-gr.cpp"
+#line 2972 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 539 "engines/director/lingo/lingo-gr.y"
+#line 550 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 2967 "engines/director/lingo/lingo-gr.cpp"
+#line 2978 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 2973 "engines/director/lingo/lingo-gr.cpp"
+#line 2984 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 541 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 2979 "engines/director/lingo/lingo-gr.cpp"
+#line 2990 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 542 "engines/director/lingo/lingo-gr.y"
+#line 553 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 2985 "engines/director/lingo/lingo-gr.cpp"
+#line 2996 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 543 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 2991 "engines/director/lingo/lingo-gr.cpp"
+#line 3002 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 2997 "engines/director/lingo/lingo-gr.cpp"
+#line 3008 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 545 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3003 "engines/director/lingo/lingo-gr.cpp"
+#line 3014 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 546 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3009 "engines/director/lingo/lingo-gr.cpp"
+#line 3020 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 548 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3017 "engines/director/lingo/lingo-gr.cpp"
+#line 3028 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3023 "engines/director/lingo/lingo-gr.cpp"
+#line 3034 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 567 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3029 "engines/director/lingo/lingo-gr.cpp"
+#line 3040 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 111:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 568 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3035 "engines/director/lingo/lingo-gr.cpp"
+#line 3046 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 112:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 569 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3041 "engines/director/lingo/lingo-gr.cpp"
+#line 3052 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 569 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3047 "engines/director/lingo/lingo-gr.cpp"
+#line 3058 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3053 "engines/director/lingo/lingo-gr.cpp"
+#line 3064 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3059 "engines/director/lingo/lingo-gr.cpp"
+#line 3070 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3065 "engines/director/lingo/lingo-gr.cpp"
+#line 3076 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3071 "engines/director/lingo/lingo-gr.cpp"
+#line 3082 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 572 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3079 "engines/director/lingo/lingo-gr.cpp"
+#line 3090 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3087 "engines/director/lingo/lingo-gr.cpp"
+#line 3098 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 578 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3093 "engines/director/lingo/lingo-gr.cpp"
+#line 3104 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 579 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3099 "engines/director/lingo/lingo-gr.cpp"
+#line 3110 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 581 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3109 "engines/director/lingo/lingo-gr.cpp"
+#line 3120 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 586 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3119 "engines/director/lingo/lingo-gr.cpp"
+#line 3130 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 581 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3129 "engines/director/lingo/lingo-gr.cpp"
+#line 3140 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 586 "engines/director/lingo/lingo-gr.y"
+#line 597 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3139 "engines/director/lingo/lingo-gr.cpp"
+#line 3150 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 603 "engines/director/lingo/lingo-gr.y"
                                                 {
-		g_lingo->code1(LC::c_instance);
-		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3149 "engines/director/lingo/lingo-gr.cpp"
+#line 3158 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 597 "engines/director/lingo/lingo-gr.y"
+#line 606 "engines/director/lingo/lingo-gr.y"
                                         {
-		g_lingo->code1(LC::c_instance);
-		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3159 "engines/director/lingo/lingo-gr.cpp"
+#line 3166 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 610 "engines/director/lingo/lingo-gr.y"
+#line 617 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3165 "engines/director/lingo/lingo-gr.cpp"
+#line 3172 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 611 "engines/director/lingo/lingo-gr.y"
+#line 618 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3171 "engines/director/lingo/lingo-gr.cpp"
+#line 3178 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 612 "engines/director/lingo/lingo-gr.y"
+#line 619 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3177 "engines/director/lingo/lingo-gr.cpp"
+#line 3184 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 613 "engines/director/lingo/lingo-gr.y"
+#line 620 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3186 "engines/director/lingo/lingo-gr.cpp"
+#line 3193 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 617 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3195 "engines/director/lingo/lingo-gr.cpp"
+#line 3202 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 621 "engines/director/lingo/lingo-gr.y"
+#line 628 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3204 "engines/director/lingo/lingo-gr.cpp"
+#line 3211 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 629 "engines/director/lingo/lingo-gr.y"
+#line 636 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3213 "engines/director/lingo/lingo-gr.cpp"
+#line 3220 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 633 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3222 "engines/director/lingo/lingo-gr.cpp"
+#line 3229 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 138:
-#line 637 "engines/director/lingo/lingo-gr.y"
+#line 644 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3231 "engines/director/lingo/lingo-gr.cpp"
+#line 3238 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 648 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3237 "engines/director/lingo/lingo-gr.cpp"
+#line 3244 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 648 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3246 "engines/director/lingo/lingo-gr.cpp"
+#line 3253 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 678 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3252 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 671 "engines/director/lingo/lingo-gr.y"
-                                { g_lingo->_currentFactory.clear(); }
-#line 3258 "engines/director/lingo/lingo-gr.cpp"
+#line 678 "engines/director/lingo/lingo-gr.y"
+                                { g_lingo->_currentFactory = NULL; }
+#line 3265 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 679 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3268 "engines/director/lingo/lingo-gr.cpp"
+#line 3275 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 677 "engines/director/lingo/lingo-gr.y"
+#line 684 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3274 "engines/director/lingo/lingo-gr.cpp"
+#line 3281 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 678 "engines/director/lingo/lingo-gr.y"
+#line 685 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3280 "engines/director/lingo/lingo-gr.cpp"
+#line 3287 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 679 "engines/director/lingo/lingo-gr.y"
+#line 686 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, &g_lingo->_currentFactory);
+		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3290 "engines/director/lingo/lingo-gr.cpp"
+#line 3297 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 691 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3299,70 +3306,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3303 "engines/director/lingo/lingo-gr.cpp"
+#line 3310 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 692 "engines/director/lingo/lingo-gr.y"
+#line 699 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3313 "engines/director/lingo/lingo-gr.cpp"
+#line 3320 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 698 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3319 "engines/director/lingo/lingo-gr.cpp"
+#line 3326 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 698 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
                                 {
-		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory.clear(); g_lingo->_ignoreMe = true; }
-#line 3326 "engines/director/lingo/lingo-gr.cpp"
+		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
+#line 3333 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 708 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3332 "engines/director/lingo/lingo-gr.cpp"
+#line 3339 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 702 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3338 "engines/director/lingo/lingo-gr.cpp"
+#line 3345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 703 "engines/director/lingo/lingo-gr.y"
+#line 710 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3344 "engines/director/lingo/lingo-gr.cpp"
+#line 3351 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 706 "engines/director/lingo/lingo-gr.y"
+#line 713 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3350 "engines/director/lingo/lingo-gr.cpp"
+#line 3357 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 707 "engines/director/lingo/lingo-gr.y"
+#line 714 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3356 "engines/director/lingo/lingo-gr.cpp"
+#line 3363 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 157:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 716 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3362 "engines/director/lingo/lingo-gr.cpp"
+#line 3369 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 711 "engines/director/lingo/lingo-gr.y"
+#line 718 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3370,113 +3377,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3374 "engines/director/lingo/lingo-gr.cpp"
+#line 3381 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 719 "engines/director/lingo/lingo-gr.y"
+#line 726 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3380 "engines/director/lingo/lingo-gr.cpp"
+#line 3387 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 720 "engines/director/lingo/lingo-gr.y"
+#line 727 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3386 "engines/director/lingo/lingo-gr.cpp"
+#line 3393 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 721 "engines/director/lingo/lingo-gr.y"
+#line 728 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3392 "engines/director/lingo/lingo-gr.cpp"
+#line 3399 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 723 "engines/director/lingo/lingo-gr.y"
+#line 730 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3398 "engines/director/lingo/lingo-gr.cpp"
+#line 3405 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 724 "engines/director/lingo/lingo-gr.y"
+#line 731 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3404 "engines/director/lingo/lingo-gr.cpp"
+#line 3411 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 726 "engines/director/lingo/lingo-gr.y"
+#line 733 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3410 "engines/director/lingo/lingo-gr.cpp"
+#line 3417 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 728 "engines/director/lingo/lingo-gr.y"
+#line 735 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3416 "engines/director/lingo/lingo-gr.cpp"
+#line 3423 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 729 "engines/director/lingo/lingo-gr.y"
+#line 736 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3422 "engines/director/lingo/lingo-gr.cpp"
+#line 3429 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 730 "engines/director/lingo/lingo-gr.y"
+#line 737 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3428 "engines/director/lingo/lingo-gr.cpp"
+#line 3435 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 731 "engines/director/lingo/lingo-gr.y"
+#line 738 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3434 "engines/director/lingo/lingo-gr.cpp"
+#line 3441 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 740 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3440 "engines/director/lingo/lingo-gr.cpp"
+#line 3447 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 734 "engines/director/lingo/lingo-gr.y"
+#line 741 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3446 "engines/director/lingo/lingo-gr.cpp"
+#line 3453 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 736 "engines/director/lingo/lingo-gr.y"
+#line 743 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3452 "engines/director/lingo/lingo-gr.cpp"
+#line 3459 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 737 "engines/director/lingo/lingo-gr.y"
+#line 744 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3458 "engines/director/lingo/lingo-gr.cpp"
+#line 3465 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 739 "engines/director/lingo/lingo-gr.y"
+#line 746 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3467 "engines/director/lingo/lingo-gr.cpp"
+#line 3474 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 750 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3476 "engines/director/lingo/lingo-gr.cpp"
+#line 3483 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3480 "engines/director/lingo/lingo-gr.cpp"
+#line 3487 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3675,7 +3682,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 749 "engines/director/lingo/lingo-gr.y"
+#line 756 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index a2eb53ffcc..b8ef3f1baf 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.6.3.  */
+/* A Bison parser, made by GNU Bison 3.6.2.  */
 
 /* Bison interface for Yacc-like parsers in C
 
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 114 "engines/director/lingo/lingo-gr.y"
+#line 125 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index a4017d1763..d5ea403d43 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -99,6 +99,17 @@ static void endDef() {
 	inNone();
 	g_lingo->_ignoreMe = false;
 
+	for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator i = g_lingo->_methodVars->begin(); i != g_lingo->_methodVars->end(); ++i) {
+		if (i->_value == kVarInstance) {
+			if (g_lingo->_currentFactory != nullptr) {
+				g_lingo->_currentFactory->properties[i->_key] = Symbol();
+				g_lingo->_currentFactory->properties[i->_key].name = new Common::String(i->_key);
+			} else {
+				warning("Instance var '%s' defined outside factory", i->_key.c_str());
+			}
+		}
+	}
+
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
 	g_lingo->_methodVarsStash = nullptr;
@@ -590,13 +601,9 @@ propertylist: ID				{
 		delete $ID; }
 
 instancelist: ID				{
-		g_lingo->code1(LC::c_instance);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarInstance);
 		delete $ID; }
 	| instancelist ',' ID		{
-		g_lingo->code1(LC::c_instance);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarInstance);
 		delete $ID; }
 
@@ -668,7 +675,7 @@ playfunc: tPLAY expr 			{ // "play #done" is also caught by this
 //
 // See also:
 //   on keyword
-defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory.clear(); }
+defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
 			lbl argdef '\n' argstore stmtlist 		{
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*$ID, $lbl, $argdef);
@@ -678,7 +685,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory.clear(); }
 	| tMETHOD { startDef(); }
 			lbl argdef '\n' argstore stmtlist 		{
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1, &g_lingo->_currentFactory);
+		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1, g_lingo->_currentFactory);
 		endDef();
 		delete $tMETHOD; }
 	| on lbl argdef '\n' argstore stmtlist ENDCLAUSE endargdef {	// D3
@@ -696,7 +703,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory.clear(); }
 		delete $on; }
 
 on:  tON { startDef(); } ID 	{
-		$$ = $ID; g_lingo->_currentFactory.clear(); g_lingo->_ignoreMe = true; }
+		$$ = $ID; g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
 
 argdef:  /* nothing */ 			{ $$ = 0; }
 	| ID						{ g_lingo->codeArg($ID); mVar($ID, kVarArgument); $$ = 1; delete $ID; }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 97f5f99b44..71a1d75303 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -619,9 +619,21 @@ Common::String Datum::asString(bool printonly) {
 		break;
 	case OBJECT:
 		if (!printonly) {
-			s = Common::String::format("#%s", u.s->c_str());
+			s = Common::String::format("#%s", u.obj->name->c_str());
 		} else {
-			s = Common::String::format("object: #%s", u.s->c_str());
+			s = Common::String::format("object: #%s properties: [", u.obj->name->c_str());
+			for (SymbolHash::iterator i = u.obj->properties.begin(); i != u.obj->properties.end(); ++i) {
+				if (i != u.obj->properties.begin())
+					s += ", ";
+				s += (*i)._key.c_str();
+			}
+			s += "] methods: [";
+			for (SymbolHash::iterator i = u.obj->methods.begin(); i != u.obj->methods.end(); ++i) {
+				if (i != u.obj->methods.begin())
+					s += ", ";
+				s += (*i)._key.c_str();
+			}
+			s += "]";
 		}
 		break;
 	case VOID:
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 06221eaa8d..2057f96bf9 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -42,6 +42,7 @@ struct TheEntity;
 struct TheEntityField;
 struct LingoV4Bytecode;
 struct LingoV4TheEntity;
+struct Object;
 struct ScriptContext;
 class DirectorEngine;
 class Frame;
@@ -87,6 +88,7 @@ struct Symbol {	/* symbol table entry */
 		Common::String	*s;	/* STRING */
 		DatumArray *farr;	/* ARRAY, POINT, RECT */
 		PropertyArray *parr;
+		Object *obj;
 	} u;
 
 	int *refCount;
@@ -117,6 +119,7 @@ struct Datum {	/* interpreter stack type */
 		Common::String *s;	/* STRING, VAR, OBJECT */
 		DatumArray *farr;	/* ARRAY, POINT, RECT */
 		PropertyArray *parr; /* PARRAY */
+		Object *obj;
 	} u;
 
 	int *refCount;
@@ -235,6 +238,25 @@ typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Comm
 typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
 typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
 
+enum ObjectType {
+    kFactoryObj = 0,
+    kScriptObj = 1
+};
+
+struct Object {
+	Common::String *name;
+    ObjectType type;
+
+    Object *prototype;
+    SymbolHash properties;
+    SymbolHash methods;
+    int inheritanceLevel; // 1 for original object
+    ScriptContext *scriptContext;
+
+    // used only for factories
+    DatumArray *objArray;
+};
+
 struct CFrame {	/* proc/func call stack frame */
 	Symbol	sp;	/* symbol table entry */
 	int		retpc;	/* where to resume after return */
@@ -330,8 +352,8 @@ public:
 	void pushContext();
 	void popContext();
 	void cleanLocalVars();
-	Symbol define(Common::String &s, int nargs, ScriptData *code, Common::Array<Common::String> *argNames = nullptr, Common::Array<Common::String> *varNames = nullptr);
-	Symbol codeDefine(Common::String &s, int start, int nargs, Common::String *prefix = NULL, int end = -1, bool removeCode = true);
+	Symbol define(Common::String &s, int nargs, ScriptData *code, Common::Array<Common::String> *argNames = nullptr, Common::Array<Common::String> *varNames = nullptr, Object *obj = nullptr);
+	Symbol codeDefine(Common::String &s, int start, int nargs, Object *obj = nullptr, int end = -1, bool removeCode = true);
 	void processIf(int toplabel, int endlabel);
 	int castIdFetch(Datum &var);
 	void varCreate(const Common::String &name, bool global);
@@ -361,7 +383,7 @@ public:
 	void codeArg(Common::String *s);
 	int codeSetImmediate(bool state);
 	int codeFunc(Common::String *s, int numpar);
-	int codeMe(Common::String *method, int numpar);
+	// int codeMe(Common::String *method, int numpar);
 	int codeFloat(double f);
 	void codeFactory(Common::String &s);
 
@@ -461,7 +483,7 @@ public:
 	bool _hadError;
 
 	bool _inFactory;
-	Common::String _currentFactory;
+	Object *_currentFactory;
 	bool _inCond;
 
 	bool _exitRepeat;


Commit: 041326bdd113c1a14618860e3a158667babe6e61
    https://github.com/scummvm/scummvm/commit/041326bdd113c1a14618860e3a158667babe6e61
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement factory method calls

Changed paths:
  A engines/director/lingo/lingo-object.cpp
  A engines/director/lingo/lingo-object.h
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/module.mk


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 8b3e57f25b..650aebe929 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -260,21 +260,6 @@ static struct BuiltinProto {
 	{ 0, 0, 0, 0, false, 0, 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++) {
 		if (blt->version > _vm->getVersion())
@@ -293,17 +278,6 @@ void Lingo::initBuiltIns() {
 
 		_functions[(void *)sym.u.s] = new FuncDesc(blt->name, "");
 	}
-
-	// Set predefined methods
-	for (const char **b = predefinedMethods; *b; b++) {
-		Common::String name(*b);
-		Datum target(name);
-		target.type = VAR;
-		Datum source(name);
-		source.type = SYMBOL;
-		g_lingo->varCreate(name, true);
-		g_lingo->varAssign(target, source, true);
-	}
 }
 
 void Lingo::cleanupBuiltins() {
@@ -2099,41 +2073,6 @@ void LB::b_version(int nargs) {
 	}
 }
 
-///////////////////
-// Factory
-///////////////////
-void LB::b_factory(int nargs) {
-	// This is intentionally empty
-}
-
-void Lingo::factoryCall(const Common::String &name, int nargs) {
-	Common::String s("factoryCall: ");
-
-	s += name;
-
-	convertVOIDtoString(0, nargs);
-
-	printSTUBWithArglist(s.c_str(), nargs);
-
-	Datum method = _stack[_stack.size() - nargs + 0];
-
-	drop(nargs - 1);
-
-	s = name + "-" + *method.u.s;
-
-	debugC(3, kDebugLingoExec, "Stack size before call: %d, nargs: %d", _stack.size(), nargs);
-	LC::call(s, 1);
-	debugC(3, kDebugLingoExec, "Stack size after call: %d", _stack.size());
-
-	if (!method.u.s->compareToIgnoreCase("mNew")) {
-		Datum d(name);
-
-		d.type = OBJECT;
-
-		g_lingo->push(d);
-	}
-}
-
 ///////////////////
 // References
 ///////////////////
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 6b600d70e0..2883e80c96 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1252,15 +1252,15 @@ void LC::call(const Common::String &name, int nargs) {
 
 	Symbol sym = g_lingo->getHandler(name);
 
-	if (!g_lingo->_eventHandlerTypeIds.contains(name)) {
-		if ((*g_lingo->_localvars).contains(name)) {
-			Datum eventName(name);
-			eventName.type = VAR;
-			Datum d = g_lingo->varFetch(eventName);
-			if (d.type == OBJECT) {
-				debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to %s", name.c_str(), d.u.s->c_str());
-				sym = g_lingo->getHandler(*d.u.s);
-			}
+	if (sym.type == VOID) {
+		Datum eventName(name);
+		eventName.type = VAR;
+		Datum d = g_lingo->varFetch(eventName);
+		if (d.type == OBJECT) {
+			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to %s", name.c_str(), d.u.obj->name->c_str());
+			sym = Symbol();
+			sym.type = OBJECT;
+			sym.u.obj = d.u.obj;
 		}
 	}
 
@@ -1270,16 +1270,28 @@ void LC::call(const Common::String &name, int nargs) {
 void LC::call(const Symbol &sym, int nargs) {
 	bool dropArgs = false;
 
-	if (sym.type == VOID) {
+	Symbol targetSym;
+	Symbol funcSym;
+	if (sym.type == OBJECT) {
+		targetSym = sym;
+		Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
+		nargs -= 1;
+		funcSym = targetSym.u.obj->getMethod(*methodName.u.s);
+	} else {
+		targetSym.type = VOID;
+		funcSym = sym;
+	}
+
+	if (funcSym.type == VOID) {
 		warning("Call to undefined handler. Dropping %d stack items", nargs);
 		dropArgs = true;
 	} else {
-		if ((sym.type == BLTIN || sym.type == FBLTIN || sym.type == RBLTIN)
-				&& sym.nargs != -1 && sym.nargs != nargs && sym.maxArgs != nargs) {
-			if (sym.nargs == sym.maxArgs)
-				warning("Incorrect number of arguments to handler '%s', expecting %d. Dropping %d stack items", sym.name->c_str(), sym.nargs, nargs);
+		if ((funcSym.type == BLTIN || funcSym.type == FBLTIN || funcSym.type == RBLTIN)
+				&& funcSym.nargs != -1 && funcSym.nargs != nargs && funcSym.maxArgs != nargs) {
+			if (funcSym.nargs == funcSym.maxArgs)
+				warning("Incorrect number of arguments to handler '%s', expecting %d. Dropping %d stack items", funcSym.name->c_str(), funcSym.nargs, nargs);
 			else
-				warning("Incorrect number of arguments to handler '%s', expecting %d or %d. Dropping %d stack items", sym.name->c_str(), sym.nargs, sym.maxArgs, nargs);
+				warning("Incorrect number of arguments to handler '%s', expecting %d or %d. Dropping %d stack items", funcSym.name->c_str(), funcSym.nargs, funcSym.maxArgs, nargs);
 
 			dropArgs = true;
 		}
@@ -1295,36 +1307,40 @@ void LC::call(const Symbol &sym, int nargs) {
 		return;
 	}
 
-	if (sym.nargs != -1 && sym.maxArgs < nargs) {
+	if (funcSym.nargs != -1 && funcSym.maxArgs < nargs) {
 		warning("Incorrect number of arguments for function %s (%d, expected %d to %d). Dropping extra %d",
-					sym.name->c_str(), nargs, sym.nargs, sym.maxArgs, nargs - sym.nargs);
-		for (int i = 0; i < nargs - sym.maxArgs; i++)
+					funcSym.name->c_str(), nargs, funcSym.nargs, funcSym.maxArgs, nargs - funcSym.nargs);
+		for (int i = 0; i < nargs - funcSym.maxArgs; i++)
 			g_lingo->pop();
 	}
 
-	if (sym.type == BLTIN || sym.type == FBLTIN || sym.type == RBLTIN) {
-		if (sym.u.bltin == LB::b_factory) {
-			g_lingo->factoryCall(*sym.name, nargs);
-		} else {
-			int stackSize = g_lingo->_stack.size() - nargs;
+	if (funcSym.type == BLTIN || funcSym.type == FBLTIN || funcSym.type == RBLTIN) {
+		int stackSize = g_lingo->_stack.size() - nargs;
 
-			(*sym.u.bltin)(nargs);
+		if (targetSym.type == OBJECT) {
+			// Only need to update the me obj
+			// Pushing an entire stack frame is not necessary
+			Object *retMeObj = g_lingo->_currentMeObj;
+			g_lingo->_currentMeObj = targetSym.u.obj;
+			(*funcSym.u.bltin)(nargs);
+			g_lingo->_currentMeObj = retMeObj;
+		} else {
+			(*funcSym.u.bltin)(nargs);
+		}
 
-			int stackNewSize = g_lingo->_stack.size();
+		int stackNewSize = g_lingo->_stack.size();
 
-			if (sym.type == FBLTIN || sym.type == RBLTIN) {
-				if (stackNewSize - stackSize != 1)
-					warning("built-in function %s did not return value", sym.name->c_str());
-			} else {
-				if (stackNewSize - stackSize != 0)
-					warning("built-in procedure %s returned extra %d values", sym.name->c_str(), stackNewSize - stackSize);
-			}
+		if (funcSym.type == FBLTIN || funcSym.type == RBLTIN) {
+			if (stackNewSize - stackSize != 1)
+				warning("built-in function %s did not return value", funcSym.name->c_str());
+		} else {
+			if (stackNewSize - stackSize != 0)
+				warning("built-in procedure %s returned extra %d values", funcSym.name->c_str(), stackNewSize - stackSize);
 		}
-
 		return;
 	}
 
-	for (int i = nargs; i < sym.nargs; i++) {
+	for (int i = nargs; i < funcSym.nargs; i++) {
 		Datum d;
 
 		d.u.s = NULL;
@@ -1340,23 +1356,24 @@ void LC::call(const Symbol &sym, int nargs) {
 	fp->retctx = g_lingo->_currentScriptContext;
 	fp->retarchive = g_lingo->_archiveIndex;
 	fp->localvars = g_lingo->_localvars;
+	fp->retMeObj = g_lingo->_currentMeObj;
 
 	// Create new set of local variables
 	g_lingo->_localvars = new SymbolHash;
-	if (sym.argNames) {
-		int symNArgs = sym.nargs;
-		if ((int)sym.argNames->size() < symNArgs) {
-			int dropSize = symNArgs - sym.argNames->size();
-			warning("%d arg names defined for %d args! Dropping the last %d values", sym.argNames->size(), symNArgs, dropSize);
+	if (funcSym.argNames) {
+		int symNArgs = funcSym.nargs;
+		if ((int)funcSym.argNames->size() < symNArgs) {
+			int dropSize = symNArgs - funcSym.argNames->size();
+			warning("%d arg names defined for %d args! Dropping the last %d values", funcSym.argNames->size(), symNArgs, dropSize);
 			for (int i = 0; i < dropSize; i++) {
 				g_lingo->pop();
 				symNArgs -= 1;
 			}
-		} else if ((int)sym.argNames->size() > symNArgs) {
-			warning("%d arg names defined for %d args! Ignoring the last %d names", sym.argNames->size(), symNArgs, sym.argNames->size() - symNArgs);
+		} else if ((int)funcSym.argNames->size() > symNArgs) {
+			warning("%d arg names defined for %d args! Ignoring the last %d names", funcSym.argNames->size(), symNArgs, funcSym.argNames->size() - symNArgs);
 		}
 		for (int i = symNArgs - 1; i >= 0; i--) {
-			Common::String name = (*sym.argNames)[i];
+			Common::String name = (*funcSym.argNames)[i];
 			if (!g_lingo->_localvars->contains(name)) {
 				g_lingo->varCreate(name, false);
 				Datum arg(name);
@@ -1368,8 +1385,8 @@ void LC::call(const Symbol &sym, int nargs) {
 			}
 		}
 	}
-	if (sym.varNames) {
-		for (Common::Array<Common::String>::iterator it = sym.varNames->begin(); it != sym.varNames->end(); ++it) {
+	if (funcSym.varNames) {
+		for (Common::Array<Common::String>::iterator it = funcSym.varNames->begin(); it != funcSym.varNames->end(); ++it) {
 			Common::String name = *it;
 			if (!g_lingo->_localvars->contains(name)) {
 				(*g_lingo->_localvars)[name] = Symbol();
@@ -1380,7 +1397,7 @@ void LC::call(const Symbol &sym, int nargs) {
 		}
 	}
 
-	fp->sp = sym;
+	fp->sp = funcSym;
 
 	g_lingo->_callstack.push_back(fp);
 
@@ -1388,13 +1405,19 @@ void LC::call(const Symbol &sym, int nargs) {
 		g_lingo->printCallStack(0);
 	}
 
-	g_lingo->_currentScript = sym.u.defn;
-	if (sym.ctx) {
-		g_lingo->_currentScriptContext = sym.ctx;
+	g_lingo->_currentScript = funcSym.u.defn;
+	if (funcSym.ctx) {
+		g_lingo->_currentScriptContext = funcSym.ctx;
 	}
-	g_lingo->_archiveIndex = sym.archiveIndex;
+	g_lingo->_archiveIndex = funcSym.archiveIndex;
 
 	g_lingo->_pc = 0;
+
+	if (targetSym.type == OBJECT) {
+		g_lingo->_currentMeObj = targetSym.u.obj;
+	} else {
+		g_lingo->_currentMeObj = nullptr;
+	}
 }
 
 void LC::c_procret() {
@@ -1413,6 +1436,7 @@ void LC::c_procret() {
 	g_lingo->_currentScriptContext = fp->retctx;
 	g_lingo->_archiveIndex = fp->retarchive;
 	g_lingo->_pc = fp->retpc;
+	g_lingo->_currentMeObj = fp->retMeObj;
 
 	if (debugChannelSet(5, kDebugLingoExec)) {
 		g_lingo->printCallStack(g_lingo->_pc);
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index da5dd4bb7f..21752027af 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -246,11 +246,19 @@ Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::
 		debugC(1, kDebugLingoCompile, "<end define code>");
 	}
 
-	if (factory != nullptr) {
+	if (factory) {
 		if (factory->methods.contains(name)) {
 			warning("Redefining method '%s' on factory '%s'", name.c_str(), factory->name->c_str());
 		}
 		factory->methods[name] = sym;
+
+		// FIXME: Method names can conflict with vars. This won't work all the time.
+		Datum target(name);
+		target.type = VAR;
+		Datum source(name);
+		source.type = SYMBOL;
+		g_lingo->varCreate(name, true);
+		g_lingo->varAssign(target, source, true);
 	} else {
 		Symbol existing = getHandler(name);
 		if (existing.type != VOID)
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
new file mode 100644
index 0000000000..f88906f468
--- /dev/null
+++ b/engines/director/lingo/lingo-object.cpp
@@ -0,0 +1,110 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+
+namespace Director {
+
+static struct MethodProto {
+	const char *name;
+	void (*func)(int);
+	int minArgs;	// -1 -- arglist
+	int maxArgs;
+	int version;
+} predefinedMethods[] = {
+    // "mAtFrame"                                                   // D2 - XObject or user-defined
+    // "mDescribe",			                                        // D2 - XObject
+	{ "mDispose",               LM::m_dispose,       0, 0, 2 },	    // D2
+	{ "mGet",			        LM::m_get,           1, 1, 2 },	    // D2
+	// "mInstanceRespondsTo",                                       // D2 - XObject
+	// "mMessageList",			                                    // D2 - XObject
+	// "mName",				                                        // D2 - XObject
+	{ "mNew",				    LM::m_new,           -1, 0, 2 },    // D2
+	// "mPerform",				                                    // D2 - XObject
+	{ "mPut",				    LM::m_put,           2, 2, 2 },	    // D2
+	// "mRespondsTo",		                                        // D2 - XObject
+	{ 0, 0, 0, 0, 0 }
+};
+
+void Lingo::initMethods() {
+	for (MethodProto *mtd = predefinedMethods; mtd->name; mtd++) {
+		if (mtd->version > _vm->getVersion())
+			continue;
+
+		Symbol sym;
+		sym.name = new Common::String(mtd->name);
+		sym.type = FBLTIN;
+		sym.nargs = mtd->minArgs;
+		sym.maxArgs = mtd->maxArgs;
+		sym.parens = false;
+		sym.u.bltin = mtd->func;
+		_methods[mtd->name] = sym;
+
+		// FIXME: Method names can conflict with vars. This won't work all the time.
+		Common::String name(mtd->name);
+		Datum target(name);
+		target.type = VAR;
+		Datum source(name);
+		source.type = SYMBOL;
+		g_lingo->varCreate(name, true);
+		g_lingo->varAssign(target, source, true);
+	}
+}
+
+Symbol Object::getMethod(Common::String &methodName, bool ignorePredefined) {
+	if (!ignorePredefined && g_lingo->_methods.contains(methodName)) {
+		return g_lingo->_methods[methodName];
+	}
+	if (methods.contains(methodName)) {
+		return methods[methodName];
+	}
+	// TODO: error handling
+	return Symbol();
+}
+
+void LM::m_dispose(int nargs) {
+	g_lingo->printSTUBWithArglist("m_dispose", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->pushVoid();
+}
+
+void LM::m_get(int nargs) {
+	g_lingo->printSTUBWithArglist("m_get", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->pushVoid();
+}
+
+void LM::m_put(int nargs) {
+	g_lingo->printSTUBWithArglist("m_put", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->pushVoid();
+}
+
+void LM::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->pushVoid();
+}
+
+}
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
new file mode 100644
index 0000000000..db818fbfd0
--- /dev/null
+++ b/engines/director/lingo/lingo-object.h
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_OBJECT_H
+#define DIRECTOR_LINGO_OBJECT_H
+
+namespace Director {
+
+namespace LM {
+	// predefined methods
+	void m_dispose(int nargs);
+	void m_get(int nargs);
+	void m_new(int nargs);
+	void m_put(int nargs);
+
+} // End of namespace LM
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 71a1d75303..1f0442fb86 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -186,6 +186,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 	initFuncs();
 	initBytecode();
 	initTheEntities();
+	initMethods();
 
 	warning("Lingo Inited");
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 2057f96bf9..d6d0cbbc7b 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -255,6 +255,8 @@ struct Object {
 
     // used only for factories
     DatumArray *objArray;
+
+	Symbol getMethod(Common::String &methodName, bool ignorePredefined = false);
 };
 
 struct CFrame {	/* proc/func call stack frame */
@@ -264,6 +266,7 @@ struct CFrame {	/* proc/func call stack frame */
 	ScriptContext	*retctx;   /* which script context to use after return */
 	int 	retarchive;	/* which archive to use after return */
 	SymbolHash *localvars;
+	Object *retMeObj; /* which me obj to use after return */
 };
 
 struct LingoEvent {
@@ -309,6 +312,7 @@ public:
 	void cleanupBuiltins();
 	void initFuncs();
 	void initBytecode();
+	void initMethods();
 
 	void runTests();
 
@@ -449,6 +453,7 @@ public:
 	ScriptContext *_currentScriptContext;
 	uint16 _currentScriptFunction;
 	ScriptData *_currentScript;
+	Object *_currentMeObj;
 
 	bool _abort;
 	bool _nextRepeat;
@@ -468,6 +473,7 @@ public:
 	Common::Array<int> _labelstack;
 
 	SymbolHash _builtins;
+	SymbolHash _methods;
 
 	int _linenumber;
 	int _colnumber;
diff --git a/engines/director/module.mk b/engines/director/module.mk
index 058fe2796d..914a5c0e51 100644
--- a/engines/director/module.mk
+++ b/engines/director/module.mk
@@ -30,6 +30,7 @@ MODULE_OBJS = \
 	lingo/lingo-events.o \
 	lingo/lingo-funcs.o \
 	lingo/lingo-lex.o \
+	lingo/lingo-object.o \
 	lingo/lingo-patcher.o \
 	lingo/lingo-preprocessor.o \
 	lingo/lingo-the.o


Commit: 95a70de5c3445bddc19537c60a15332cae3f9398
    https://github.com/scummvm/scummvm/commit/95a70de5c3445bddc19537c60a15332cae3f9398
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Clean up LC::call

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-code.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 2883e80c96..885013eeba 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1250,37 +1250,30 @@ void LC::call(const Common::String &name, int nargs) {
 	if (debugChannelSet(3, kDebugLingoExec))
 		g_lingo->printSTUBWithArglist(name.c_str(), nargs, "call:");
 
-	Symbol sym = g_lingo->getHandler(name);
+	Symbol targetSym = Symbol();
+	Symbol funcSym = g_lingo->getHandler(name);
 
-	if (sym.type == VOID) {
+	if (funcSym.type == VOID) {
 		Datum eventName(name);
 		eventName.type = VAR;
 		Datum d = g_lingo->varFetch(eventName);
 		if (d.type == OBJECT) {
 			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to %s", name.c_str(), d.u.obj->name->c_str());
-			sym = Symbol();
-			sym.type = OBJECT;
-			sym.u.obj = d.u.obj;
+			targetSym = Symbol();
+			targetSym.type = OBJECT;
+			targetSym.u.obj = d.u.obj;
 		}
-	}
-
-	call(sym, nargs);
-}
-
-void LC::call(const Symbol &sym, int nargs) {
-	bool dropArgs = false;
-
-	Symbol targetSym;
-	Symbol funcSym;
-	if (sym.type == OBJECT) {
-		targetSym = sym;
 		Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
 		nargs -= 1;
 		funcSym = targetSym.u.obj->getMethod(*methodName.u.s);
+		call(funcSym, nargs, targetSym);
 	} else {
-		targetSym.type = VOID;
-		funcSym = sym;
+		call(funcSym, nargs);
 	}
+}
+
+void LC::call(const Symbol &funcSym, int nargs, const Symbol &targetSym) {
+	bool dropArgs = false;
 
 	if (funcSym.type == VOID) {
 		warning("Call to undefined handler. Dropping %d stack items", nargs);
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index cf1a559237..01c1f4c873 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -116,7 +116,7 @@ namespace LC {
 	void c_jumpifz();
 	void c_call();
 
-	void call(const Symbol &sym, int nargs);
+	void call(const Symbol &targetSym, int nargs, const Symbol &funcSym = Symbol());
 	void call(const Common::String &name, int nargs);
 
 	void c_procret();


Commit: eef6fbe8316b3287fb5b1aeacc6b2e2d1a0e6b51
    https://github.com/scummvm/scummvm/commit/eef6fbe8316b3287fb5b1aeacc6b2e2d1a0e6b51
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement m_new

Changed paths:
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index f88906f468..d192c909ee 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -22,6 +22,7 @@
 
 #include "director/director.h"
 #include "director/lingo/lingo.h"
+#include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-object.h"
 
 namespace Director {
@@ -72,6 +73,21 @@ void Lingo::initMethods() {
 	}
 }
 
+Object *Object::clone() {
+	Object *res = new Object;
+	res->name = name;
+	res->type = type;
+	res->prototype = this;
+	res->properties = properties;
+	res->methods = methods;
+	res->inheritanceLevel = inheritanceLevel + 1;
+	res->scriptContext = scriptContext;
+	if (objArray) {
+		res->objArray = new DatumArray(*objArray);
+	}
+	return res;
+}
+
 Symbol Object::getMethod(Common::String &methodName, bool ignorePredefined) {
 	if (!ignorePredefined && g_lingo->_methods.contains(methodName)) {
 		return g_lingo->_methods[methodName];
@@ -102,9 +118,22 @@ void LM::m_put(int nargs) {
 }
 
 void LM::m_new(int nargs) {
-	g_lingo->printSTUBWithArglist("m_new", nargs);
-	g_lingo->dropStack(nargs);
-	g_lingo->pushVoid();
+	Object *clone = g_lingo->_currentMeObj->clone();
+
+	// Call user-defined mNew
+	Common::String methodName("mNew");
+	Symbol userMNew = clone->getMethod(methodName, true);
+	Symbol cloneSym;
+	cloneSym.type = OBJECT;
+	cloneSym.u.obj = clone;
+	if (userMNew.type != VOID) {
+		LC::call(userMNew, nargs, cloneSym);
+	}
+
+	Datum res;
+	res.type = OBJECT;
+	res.u.obj = clone;
+	g_lingo->push(res);
 }
 
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index d6d0cbbc7b..a37a901ca7 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -256,6 +256,7 @@ struct Object {
     // used only for factories
     DatumArray *objArray;
 
+	Object *clone();
 	Symbol getMethod(Common::String &methodName, bool ignorePredefined = false);
 };
 


Commit: fddf6dd193622a97d22653928f8667f526fed6a0
    https://github.com/scummvm/scummvm/commit/fddf6dd193622a97d22653928f8667f526fed6a0
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement instance vars

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 21752027af..f06ed50847 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -477,7 +477,11 @@ void Lingo::varCreate(const Common::String &name, bool global) {
 		if (global)
 			warning("varCreate: variable %s is local, not global", name.c_str());
 		return;
-	} else if (_globalvars.contains(name)) {
+	} else if (_currentMeObj && _currentMeObj->hasVar(name)) {
+		if (global)
+			warning("varCreate: variable %s is instance or property, not global", name.c_str());
+		return;
+	} else  if (_globalvars.contains(name)) {
 		if (!global)
 			warning("varCreate: variable %s is global, not local", name.c_str());
 		return;
@@ -506,6 +510,10 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global) {
 			sym = &(*_localvars)[name];
 			if (global)
 				warning("varAssign: variable %s is local, not global", name.c_str());
+		} else if (_currentMeObj && _currentMeObj->hasVar(name)) {
+			sym = &_currentMeObj->getVar(name);
+			if (global)
+				warning("varAssign: variable %s is instance or property, not global", sym->name->c_str());
 		} else if (_globalvars.contains(name)) {
 			sym = &_globalvars[name];
 			if (!global)
@@ -584,6 +592,10 @@ Datum Lingo::varFetch(Datum &var, bool global) {
 			sym = &(*_localvars)[name];
 			if (global)
 				warning("varFetch: variable %s is local, not global", sym->name->c_str());
+		} else if (_currentMeObj && _currentMeObj->hasVar(name)) {
+			sym = &_currentMeObj->getVar(name);
+			if (global)
+				warning("varFetch: variable %s is instance or property, not global", sym->name->c_str());
 		} else if (_globalvars.contains(name)) {
 			sym = &_globalvars[name];
 			if (!global)
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 642e854eee..0fd9a36256 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -109,6 +109,12 @@ static void startDef() {
 	inArgs();
 	g_lingo->_methodVarsStash = g_lingo->_methodVars;
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
+
+	if (g_lingo->_currentFactory) {
+		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
+		}
+	}
 }
 
 static void endDef() {
@@ -116,29 +122,27 @@ static void endDef() {
 	inNone();
 	g_lingo->_ignoreMe = false;
 
-	for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator i = g_lingo->_methodVars->begin(); i != g_lingo->_methodVars->end(); ++i) {
-		if (i->_value == kVarInstance) {
-			if (g_lingo->_currentFactory != nullptr) {
-				g_lingo->_currentFactory->properties[i->_key] = Symbol();
-				g_lingo->_currentFactory->properties[i->_key].name = new Common::String(i->_key);
-			} else {
-				warning("Instance var '%s' defined outside factory", i->_key.c_str());
-			}
-		}
-	}
-
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
 	g_lingo->_methodVarsStash = nullptr;
 }
 
 static void mVar(Common::String *s, VarType type) {
-	if (!g_lingo->_methodVars->contains(*s))
+	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
+		if (type == kVarInstance) {
+			if (g_lingo->_currentFactory) {
+				g_lingo->_currentFactory->properties[*s] = Symbol();
+				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
+			} else {
+				warning("Instance var '%s' defined outside factory", s->c_str());
+			}
+		}
+	}
 }
 
 
-#line 142 "engines/director/lingo/lingo-gr.cpp"
+#line 146 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -275,7 +279,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 125 "engines/director/lingo/lingo-gr.y"
+#line 129 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -295,7 +299,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 299 "engines/director/lingo/lingo-gr.cpp"
+#line 303 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -848,24 +852,24 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   184,   184,   185,   187,   188,   189,   191,   198,   202,
-     213,   214,   215,   222,   229,   236,   243,   249,   256,   267,
-     274,   275,   276,   278,   279,   284,   296,   300,   303,   295,
-     327,   331,   334,   326,   360,   367,   373,   359,   401,   403,
-     406,   407,   409,   411,   418,   426,   427,   429,   435,   439,
-     443,   447,   450,   452,   453,   454,   456,   459,   462,   466,
-     470,   474,   482,   488,   489,   490,   501,   502,   503,   506,
-     509,   512,   515,   520,   526,   527,   528,   529,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   543,   544,   545,   546,   547,   548,   550,   551,   552,
-     553,   554,   555,   556,   557,   559,   562,   564,   565,   566,
-     567,   568,   569,   569,   570,   570,   571,   571,   572,   575,
-     578,   579,   581,   586,   592,   597,   603,   606,   617,   618,
-     619,   620,   624,   628,   633,   634,   636,   640,   644,   648,
-     648,   678,   678,   678,   684,   685,   685,   691,   699,   705,
-     705,   708,   709,   710,   712,   713,   714,   716,   718,   726,
-     727,   728,   730,   731,   733,   735,   736,   737,   738,   740,
-     741,   743,   744,   746,   750
+       0,   188,   188,   189,   191,   192,   193,   195,   202,   206,
+     217,   218,   219,   226,   233,   240,   247,   253,   260,   271,
+     278,   279,   280,   282,   283,   288,   300,   304,   307,   299,
+     331,   335,   338,   330,   364,   371,   377,   363,   405,   407,
+     410,   411,   413,   415,   422,   430,   431,   433,   439,   443,
+     447,   451,   454,   456,   457,   458,   460,   463,   466,   470,
+     474,   478,   486,   492,   493,   494,   505,   506,   507,   510,
+     513,   516,   519,   524,   530,   531,   532,   533,   534,   535,
+     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   552,   554,   555,   556,
+     557,   558,   559,   560,   561,   563,   566,   568,   569,   570,
+     571,   572,   573,   573,   574,   574,   575,   575,   576,   579,
+     582,   583,   585,   590,   596,   601,   607,   610,   621,   622,
+     623,   624,   628,   632,   637,   638,   640,   644,   648,   652,
+     652,   682,   682,   682,   688,   689,   689,   695,   703,   709,
+     709,   712,   713,   714,   716,   717,   718,   720,   722,   730,
+     731,   732,   734,   735,   737,   739,   740,   741,   742,   744,
+     745,   747,   748,   750,   754
 };
 #endif
 
@@ -1928,81 +1932,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1934 "engines/director/lingo/lingo-gr.cpp"
+#line 1938 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1940 "engines/director/lingo/lingo-gr.cpp"
+#line 1944 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1946 "engines/director/lingo/lingo-gr.cpp"
+#line 1950 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1952 "engines/director/lingo/lingo-gr.cpp"
+#line 1956 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1958 "engines/director/lingo/lingo-gr.cpp"
+#line 1962 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1964 "engines/director/lingo/lingo-gr.cpp"
+#line 1968 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1970 "engines/director/lingo/lingo-gr.cpp"
+#line 1974 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1976 "engines/director/lingo/lingo-gr.cpp"
+#line 1980 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1982 "engines/director/lingo/lingo-gr.cpp"
+#line 1986 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1988 "engines/director/lingo/lingo-gr.cpp"
+#line 1992 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1994 "engines/director/lingo/lingo-gr.cpp"
+#line 1998 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 180 "engines/director/lingo/lingo-gr.y"
+#line 184 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2000 "engines/director/lingo/lingo-gr.cpp"
+#line 2004 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 147: /* on  */
-#line 179 "engines/director/lingo/lingo-gr.y"
+#line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2006 "engines/director/lingo/lingo-gr.cpp"
+#line 2010 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2281,7 +2285,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 195 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2289,19 +2293,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2293 "engines/director/lingo/lingo-gr.cpp"
+#line 2297 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 198 "engines/director/lingo/lingo-gr.y"
+#line 202 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2301 "engines/director/lingo/lingo-gr.cpp"
+#line 2305 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 202 "engines/director/lingo/lingo-gr.y"
+#line 206 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2313,23 +2317,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2317 "engines/director/lingo/lingo-gr.cpp"
+#line 2321 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 213 "engines/director/lingo/lingo-gr.y"
+#line 217 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2323 "engines/director/lingo/lingo-gr.cpp"
+#line 2327 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 214 "engines/director/lingo/lingo-gr.y"
+#line 218 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2329 "engines/director/lingo/lingo-gr.cpp"
+#line 2333 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 215 "engines/director/lingo/lingo-gr.y"
+#line 219 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2337,11 +2341,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2341 "engines/director/lingo/lingo-gr.cpp"
+#line 2345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 222 "engines/director/lingo/lingo-gr.y"
+#line 226 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2349,11 +2353,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2353 "engines/director/lingo/lingo-gr.cpp"
+#line 2357 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 229 "engines/director/lingo/lingo-gr.y"
+#line 233 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2361,11 +2365,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2365 "engines/director/lingo/lingo-gr.cpp"
+#line 2369 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 236 "engines/director/lingo/lingo-gr.y"
+#line 240 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2373,33 +2377,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2377 "engines/director/lingo/lingo-gr.cpp"
+#line 2381 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 243 "engines/director/lingo/lingo-gr.y"
+#line 247 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2388 "engines/director/lingo/lingo-gr.cpp"
+#line 2392 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 249 "engines/director/lingo/lingo-gr.y"
+#line 253 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2399 "engines/director/lingo/lingo-gr.cpp"
+#line 2403 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 256 "engines/director/lingo/lingo-gr.y"
+#line 260 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2411,54 +2415,54 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2415 "engines/director/lingo/lingo-gr.cpp"
+#line 2419 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 267 "engines/director/lingo/lingo-gr.y"
+#line 271 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2426 "engines/director/lingo/lingo-gr.cpp"
+#line 2430 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 284 "engines/director/lingo/lingo-gr.y"
+#line 288 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-5].code) - (yyvsp[-1].code) + 1);
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2437 "engines/director/lingo/lingo-gr.cpp"
+#line 2441 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 296 "engines/director/lingo/lingo-gr.y"
+#line 300 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2445 "engines/director/lingo/lingo-gr.cpp"
+#line 2449 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 300 "engines/director/lingo/lingo-gr.y"
+#line 304 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2452 "engines/director/lingo/lingo-gr.cpp"
+#line 2456 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 303 "engines/director/lingo/lingo-gr.y"
+#line 307 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2458 "engines/director/lingo/lingo-gr.cpp"
+#line 2462 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 303 "engines/director/lingo/lingo-gr.y"
+#line 307 "engines/director/lingo/lingo-gr.y"
                                                                                           {
 
 		g_lingo->code1(LC::c_eval);
@@ -2477,32 +2481,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2481 "engines/director/lingo/lingo-gr.cpp"
+#line 2485 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 327 "engines/director/lingo/lingo-gr.y"
+#line 331 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2489 "engines/director/lingo/lingo-gr.cpp"
+#line 2493 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 331 "engines/director/lingo/lingo-gr.y"
+#line 335 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2496 "engines/director/lingo/lingo-gr.cpp"
+#line 2500 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 334 "engines/director/lingo/lingo-gr.y"
+#line 338 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2502 "engines/director/lingo/lingo-gr.cpp"
+#line 2506 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 335 "engines/director/lingo/lingo-gr.y"
+#line 339 "engines/director/lingo/lingo-gr.y"
                                                     {
 
 		g_lingo->code1(LC::c_eval);
@@ -2521,32 +2525,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2525 "engines/director/lingo/lingo-gr.cpp"
+#line 2529 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 360 "engines/director/lingo/lingo-gr.y"
+#line 364 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2536 "engines/director/lingo/lingo-gr.cpp"
+#line 2540 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 367 "engines/director/lingo/lingo-gr.y"
+#line 371 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2546 "engines/director/lingo/lingo-gr.cpp"
+#line 2550 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 373 "engines/director/lingo/lingo-gr.y"
+#line 377 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2557,11 +2561,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), kVarLocal);
 				  g_lingo->code1(LC::c_assign); }
-#line 2561 "engines/director/lingo/lingo-gr.cpp"
+#line 2565 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 383 "engines/director/lingo/lingo-gr.y"
+#line 387 "engines/director/lingo/lingo-gr.y"
                                             {
 
 		g_lingo->code1(LC::c_intpush);
@@ -2579,44 +2583,44 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2583 "engines/director/lingo/lingo-gr.cpp"
+#line 2587 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 401 "engines/director/lingo/lingo-gr.y"
+#line 405 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2590 "engines/director/lingo/lingo-gr.cpp"
+#line 2594 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 403 "engines/director/lingo/lingo-gr.y"
+#line 407 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2598 "engines/director/lingo/lingo-gr.cpp"
+#line 2602 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 406 "engines/director/lingo/lingo-gr.y"
+#line 410 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2604 "engines/director/lingo/lingo-gr.cpp"
+#line 2608 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 407 "engines/director/lingo/lingo-gr.y"
+#line 411 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2610 "engines/director/lingo/lingo-gr.cpp"
+#line 2614 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 409 "engines/director/lingo/lingo-gr.y"
+#line 413 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2616 "engines/director/lingo/lingo-gr.cpp"
+#line 2620 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 411 "engines/director/lingo/lingo-gr.y"
+#line 415 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2624,11 +2628,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2628 "engines/director/lingo/lingo-gr.cpp"
+#line 2632 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 418 "engines/director/lingo/lingo-gr.y"
+#line 422 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2636,107 +2640,107 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2640 "engines/director/lingo/lingo-gr.cpp"
+#line 2644 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 429 "engines/director/lingo/lingo-gr.y"
+#line 433 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2650 "engines/director/lingo/lingo-gr.cpp"
+#line 2654 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 435 "engines/director/lingo/lingo-gr.y"
+#line 439 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2658 "engines/director/lingo/lingo-gr.cpp"
+#line 2662 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 439 "engines/director/lingo/lingo-gr.y"
+#line 443 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2666 "engines/director/lingo/lingo-gr.cpp"
+#line 2670 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 443 "engines/director/lingo/lingo-gr.y"
+#line 447 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2674 "engines/director/lingo/lingo-gr.cpp"
+#line 2678 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 447 "engines/director/lingo/lingo-gr.y"
+#line 451 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2681 "engines/director/lingo/lingo-gr.cpp"
+#line 2685 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 450 "engines/director/lingo/lingo-gr.y"
+#line 454 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2687 "engines/director/lingo/lingo-gr.cpp"
+#line 2691 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 452 "engines/director/lingo/lingo-gr.y"
+#line 456 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2693 "engines/director/lingo/lingo-gr.cpp"
+#line 2697 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 456 "engines/director/lingo/lingo-gr.y"
+#line 460 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2701 "engines/director/lingo/lingo-gr.cpp"
+#line 2705 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 459 "engines/director/lingo/lingo-gr.y"
+#line 463 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2709 "engines/director/lingo/lingo-gr.cpp"
+#line 2713 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 462 "engines/director/lingo/lingo-gr.y"
+#line 466 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2718 "engines/director/lingo/lingo-gr.cpp"
+#line 2722 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 466 "engines/director/lingo/lingo-gr.y"
+#line 470 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2727 "engines/director/lingo/lingo-gr.cpp"
+#line 2731 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 470 "engines/director/lingo/lingo-gr.y"
+#line 474 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2736 "engines/director/lingo/lingo-gr.cpp"
+#line 2740 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 474 "engines/director/lingo/lingo-gr.y"
+#line 478 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2745,28 +2749,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2749 "engines/director/lingo/lingo-gr.cpp"
+#line 2753 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 482 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2760 "engines/director/lingo/lingo-gr.cpp"
+#line 2764 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 488 "engines/director/lingo/lingo-gr.y"
+#line 492 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2766 "engines/director/lingo/lingo-gr.cpp"
+#line 2770 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 490 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2777,527 +2781,527 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2781 "engines/director/lingo/lingo-gr.cpp"
+#line 2785 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 505 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2787 "engines/director/lingo/lingo-gr.cpp"
+#line 2791 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 503 "engines/director/lingo/lingo-gr.y"
+#line 507 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2795 "engines/director/lingo/lingo-gr.cpp"
+#line 2799 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 506 "engines/director/lingo/lingo-gr.y"
+#line 510 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2803 "engines/director/lingo/lingo-gr.cpp"
+#line 2807 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 509 "engines/director/lingo/lingo-gr.y"
+#line 513 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2811 "engines/director/lingo/lingo-gr.cpp"
+#line 2815 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 512 "engines/director/lingo/lingo-gr.y"
+#line 516 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2819 "engines/director/lingo/lingo-gr.cpp"
+#line 2823 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 515 "engines/director/lingo/lingo-gr.y"
+#line 519 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2829 "engines/director/lingo/lingo-gr.cpp"
+#line 2833 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 520 "engines/director/lingo/lingo-gr.y"
+#line 524 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2840 "engines/director/lingo/lingo-gr.cpp"
+#line 2844 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 531 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2846 "engines/director/lingo/lingo-gr.cpp"
+#line 2850 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 528 "engines/director/lingo/lingo-gr.y"
+#line 532 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2852 "engines/director/lingo/lingo-gr.cpp"
+#line 2856 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77:
-#line 529 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2858 "engines/director/lingo/lingo-gr.cpp"
+#line 2862 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 530 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2864 "engines/director/lingo/lingo-gr.cpp"
+#line 2868 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 531 "engines/director/lingo/lingo-gr.y"
+#line 535 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2870 "engines/director/lingo/lingo-gr.cpp"
+#line 2874 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 532 "engines/director/lingo/lingo-gr.y"
+#line 536 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2876 "engines/director/lingo/lingo-gr.cpp"
+#line 2880 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 533 "engines/director/lingo/lingo-gr.y"
+#line 537 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2882 "engines/director/lingo/lingo-gr.cpp"
+#line 2886 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 534 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2888 "engines/director/lingo/lingo-gr.cpp"
+#line 2892 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2894 "engines/director/lingo/lingo-gr.cpp"
+#line 2898 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 540 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2900 "engines/director/lingo/lingo-gr.cpp"
+#line 2904 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 537 "engines/director/lingo/lingo-gr.y"
+#line 541 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2906 "engines/director/lingo/lingo-gr.cpp"
+#line 2910 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 538 "engines/director/lingo/lingo-gr.y"
+#line 542 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2912 "engines/director/lingo/lingo-gr.cpp"
+#line 2916 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 539 "engines/director/lingo/lingo-gr.y"
+#line 543 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2918 "engines/director/lingo/lingo-gr.cpp"
+#line 2922 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 544 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2924 "engines/director/lingo/lingo-gr.cpp"
+#line 2928 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 541 "engines/director/lingo/lingo-gr.y"
+#line 545 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2930 "engines/director/lingo/lingo-gr.cpp"
+#line 2934 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 542 "engines/director/lingo/lingo-gr.y"
+#line 546 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2936 "engines/director/lingo/lingo-gr.cpp"
+#line 2940 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 543 "engines/director/lingo/lingo-gr.y"
+#line 547 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2942 "engines/director/lingo/lingo-gr.cpp"
+#line 2946 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 548 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2948 "engines/director/lingo/lingo-gr.cpp"
+#line 2952 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 545 "engines/director/lingo/lingo-gr.y"
+#line 549 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 2954 "engines/director/lingo/lingo-gr.cpp"
+#line 2958 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 546 "engines/director/lingo/lingo-gr.y"
+#line 550 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 2960 "engines/director/lingo/lingo-gr.cpp"
+#line 2964 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 547 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 2966 "engines/director/lingo/lingo-gr.cpp"
+#line 2970 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 548 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 2972 "engines/director/lingo/lingo-gr.cpp"
+#line 2976 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 550 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 2978 "engines/director/lingo/lingo-gr.cpp"
+#line 2982 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 551 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 2984 "engines/director/lingo/lingo-gr.cpp"
+#line 2988 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 552 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 2990 "engines/director/lingo/lingo-gr.cpp"
+#line 2994 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 2996 "engines/director/lingo/lingo-gr.cpp"
+#line 3000 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 554 "engines/director/lingo/lingo-gr.y"
+#line 558 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3002 "engines/director/lingo/lingo-gr.cpp"
+#line 3006 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 555 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3008 "engines/director/lingo/lingo-gr.cpp"
+#line 3012 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 560 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3014 "engines/director/lingo/lingo-gr.cpp"
+#line 3018 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 561 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3020 "engines/director/lingo/lingo-gr.cpp"
+#line 3024 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3028 "engines/director/lingo/lingo-gr.cpp"
+#line 3032 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 568 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3034 "engines/director/lingo/lingo-gr.cpp"
+#line 3038 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3040 "engines/director/lingo/lingo-gr.cpp"
+#line 3044 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 111:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 572 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3046 "engines/director/lingo/lingo-gr.cpp"
+#line 3050 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 112:
-#line 569 "engines/director/lingo/lingo-gr.y"
+#line 573 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3052 "engines/director/lingo/lingo-gr.cpp"
+#line 3056 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 569 "engines/director/lingo/lingo-gr.y"
+#line 573 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3058 "engines/director/lingo/lingo-gr.cpp"
+#line 3062 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3064 "engines/director/lingo/lingo-gr.cpp"
+#line 3068 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3070 "engines/director/lingo/lingo-gr.cpp"
+#line 3074 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3076 "engines/director/lingo/lingo-gr.cpp"
+#line 3080 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3082 "engines/director/lingo/lingo-gr.cpp"
+#line 3086 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 572 "engines/director/lingo/lingo-gr.y"
+#line 576 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3090 "engines/director/lingo/lingo-gr.cpp"
+#line 3094 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 579 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3098 "engines/director/lingo/lingo-gr.cpp"
+#line 3102 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 578 "engines/director/lingo/lingo-gr.y"
+#line 582 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3104 "engines/director/lingo/lingo-gr.cpp"
+#line 3108 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 579 "engines/director/lingo/lingo-gr.y"
+#line 583 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3110 "engines/director/lingo/lingo-gr.cpp"
+#line 3114 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 581 "engines/director/lingo/lingo-gr.y"
+#line 585 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3120 "engines/director/lingo/lingo-gr.cpp"
+#line 3124 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 586 "engines/director/lingo/lingo-gr.y"
+#line 590 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3130 "engines/director/lingo/lingo-gr.cpp"
+#line 3134 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3140 "engines/director/lingo/lingo-gr.cpp"
+#line 3144 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 597 "engines/director/lingo/lingo-gr.y"
+#line 601 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3150 "engines/director/lingo/lingo-gr.cpp"
+#line 3154 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 603 "engines/director/lingo/lingo-gr.y"
+#line 607 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3158 "engines/director/lingo/lingo-gr.cpp"
+#line 3162 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 606 "engines/director/lingo/lingo-gr.y"
+#line 610 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3166 "engines/director/lingo/lingo-gr.cpp"
+#line 3170 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 617 "engines/director/lingo/lingo-gr.y"
+#line 621 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3172 "engines/director/lingo/lingo-gr.cpp"
+#line 3176 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 618 "engines/director/lingo/lingo-gr.y"
+#line 622 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3178 "engines/director/lingo/lingo-gr.cpp"
+#line 3182 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 619 "engines/director/lingo/lingo-gr.y"
+#line 623 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3184 "engines/director/lingo/lingo-gr.cpp"
+#line 3188 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 620 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3193 "engines/director/lingo/lingo-gr.cpp"
+#line 3197 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 624 "engines/director/lingo/lingo-gr.y"
+#line 628 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3202 "engines/director/lingo/lingo-gr.cpp"
+#line 3206 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 628 "engines/director/lingo/lingo-gr.y"
+#line 632 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3211 "engines/director/lingo/lingo-gr.cpp"
+#line 3215 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 636 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3220 "engines/director/lingo/lingo-gr.cpp"
+#line 3224 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 644 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3229 "engines/director/lingo/lingo-gr.cpp"
+#line 3233 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 138:
-#line 644 "engines/director/lingo/lingo-gr.y"
+#line 648 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3238 "engines/director/lingo/lingo-gr.cpp"
+#line 3242 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 652 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3244 "engines/director/lingo/lingo-gr.cpp"
+#line 3248 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 652 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3253 "engines/director/lingo/lingo-gr.cpp"
+#line 3257 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 678 "engines/director/lingo/lingo-gr.y"
+#line 682 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3259 "engines/director/lingo/lingo-gr.cpp"
+#line 3263 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 678 "engines/director/lingo/lingo-gr.y"
+#line 682 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3265 "engines/director/lingo/lingo-gr.cpp"
+#line 3269 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 679 "engines/director/lingo/lingo-gr.y"
+#line 683 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3275 "engines/director/lingo/lingo-gr.cpp"
+#line 3279 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 688 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3281 "engines/director/lingo/lingo-gr.cpp"
+#line 3285 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 689 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3287 "engines/director/lingo/lingo-gr.cpp"
+#line 3291 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 686 "engines/director/lingo/lingo-gr.y"
+#line 690 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3297 "engines/director/lingo/lingo-gr.cpp"
+#line 3301 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 691 "engines/director/lingo/lingo-gr.y"
+#line 695 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3306,70 +3310,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3310 "engines/director/lingo/lingo-gr.cpp"
+#line 3314 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 699 "engines/director/lingo/lingo-gr.y"
+#line 703 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3320 "engines/director/lingo/lingo-gr.cpp"
+#line 3324 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 705 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3326 "engines/director/lingo/lingo-gr.cpp"
+#line 3330 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 705 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
-#line 3333 "engines/director/lingo/lingo-gr.cpp"
+#line 3337 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 708 "engines/director/lingo/lingo-gr.y"
+#line 712 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3339 "engines/director/lingo/lingo-gr.cpp"
+#line 3343 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 713 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3345 "engines/director/lingo/lingo-gr.cpp"
+#line 3349 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 710 "engines/director/lingo/lingo-gr.y"
+#line 714 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3351 "engines/director/lingo/lingo-gr.cpp"
+#line 3355 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 717 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3357 "engines/director/lingo/lingo-gr.cpp"
+#line 3361 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 714 "engines/director/lingo/lingo-gr.y"
+#line 718 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3363 "engines/director/lingo/lingo-gr.cpp"
+#line 3367 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 157:
-#line 716 "engines/director/lingo/lingo-gr.y"
+#line 720 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3369 "engines/director/lingo/lingo-gr.cpp"
+#line 3373 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 718 "engines/director/lingo/lingo-gr.y"
+#line 722 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3377,113 +3381,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3381 "engines/director/lingo/lingo-gr.cpp"
+#line 3385 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 726 "engines/director/lingo/lingo-gr.y"
+#line 730 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3387 "engines/director/lingo/lingo-gr.cpp"
+#line 3391 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 727 "engines/director/lingo/lingo-gr.y"
+#line 731 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3393 "engines/director/lingo/lingo-gr.cpp"
+#line 3397 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 728 "engines/director/lingo/lingo-gr.y"
+#line 732 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3399 "engines/director/lingo/lingo-gr.cpp"
+#line 3403 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 730 "engines/director/lingo/lingo-gr.y"
+#line 734 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3405 "engines/director/lingo/lingo-gr.cpp"
+#line 3409 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 731 "engines/director/lingo/lingo-gr.y"
+#line 735 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3411 "engines/director/lingo/lingo-gr.cpp"
+#line 3415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 737 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3417 "engines/director/lingo/lingo-gr.cpp"
+#line 3421 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 735 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3423 "engines/director/lingo/lingo-gr.cpp"
+#line 3427 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 736 "engines/director/lingo/lingo-gr.y"
+#line 740 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3429 "engines/director/lingo/lingo-gr.cpp"
+#line 3433 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 737 "engines/director/lingo/lingo-gr.y"
+#line 741 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3435 "engines/director/lingo/lingo-gr.cpp"
+#line 3439 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 738 "engines/director/lingo/lingo-gr.y"
+#line 742 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3441 "engines/director/lingo/lingo-gr.cpp"
+#line 3445 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 740 "engines/director/lingo/lingo-gr.y"
+#line 744 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3447 "engines/director/lingo/lingo-gr.cpp"
+#line 3451 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 741 "engines/director/lingo/lingo-gr.y"
+#line 745 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3453 "engines/director/lingo/lingo-gr.cpp"
+#line 3457 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 747 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3459 "engines/director/lingo/lingo-gr.cpp"
+#line 3463 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 744 "engines/director/lingo/lingo-gr.y"
+#line 748 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3465 "engines/director/lingo/lingo-gr.cpp"
+#line 3469 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 746 "engines/director/lingo/lingo-gr.y"
+#line 750 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3474 "engines/director/lingo/lingo-gr.cpp"
+#line 3478 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 754 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3483 "engines/director/lingo/lingo-gr.cpp"
+#line 3487 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3487 "engines/director/lingo/lingo-gr.cpp"
+#line 3491 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3682,7 +3686,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 756 "engines/director/lingo/lingo-gr.y"
+#line 760 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index b8ef3f1baf..303bd41d2d 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 125 "engines/director/lingo/lingo-gr.y"
+#line 129 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index d5ea403d43..8005eb2612 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -92,6 +92,12 @@ static void startDef() {
 	inArgs();
 	g_lingo->_methodVarsStash = g_lingo->_methodVars;
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
+
+	if (g_lingo->_currentFactory) {
+		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
+		}
+	}
 }
 
 static void endDef() {
@@ -99,25 +105,23 @@ static void endDef() {
 	inNone();
 	g_lingo->_ignoreMe = false;
 
-	for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator i = g_lingo->_methodVars->begin(); i != g_lingo->_methodVars->end(); ++i) {
-		if (i->_value == kVarInstance) {
-			if (g_lingo->_currentFactory != nullptr) {
-				g_lingo->_currentFactory->properties[i->_key] = Symbol();
-				g_lingo->_currentFactory->properties[i->_key].name = new Common::String(i->_key);
-			} else {
-				warning("Instance var '%s' defined outside factory", i->_key.c_str());
-			}
-		}
-	}
-
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
 	g_lingo->_methodVarsStash = nullptr;
 }
 
 static void mVar(Common::String *s, VarType type) {
-	if (!g_lingo->_methodVars->contains(*s))
+	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
+		if (type == kVarInstance) {
+			if (g_lingo->_currentFactory) {
+				g_lingo->_currentFactory->properties[*s] = Symbol();
+				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
+			} else {
+				warning("Instance var '%s' defined outside factory", s->c_str());
+			}
+		}
+	}
 }
 
 %}
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index d192c909ee..1d10017d7e 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -88,7 +88,7 @@ Object *Object::clone() {
 	return res;
 }
 
-Symbol Object::getMethod(Common::String &methodName, bool ignorePredefined) {
+Symbol Object::getMethod(const Common::String &methodName, bool ignorePredefined) {
 	if (!ignorePredefined && g_lingo->_methods.contains(methodName)) {
 		return g_lingo->_methods[methodName];
 	}
@@ -99,6 +99,19 @@ Symbol Object::getMethod(Common::String &methodName, bool ignorePredefined) {
 	return Symbol();
 }
 
+bool Object::hasVar(const Common::String &varName) {
+	// Factory object instance vars are accessed like normal vars
+	// Script object properties cannot be accessed like normal vars until D5
+	if (type == kScriptObj && g_lingo->_vm->getVersion() < 5) {
+		return false;
+	}
+	return properties.contains(varName);
+}
+
+Symbol &Object::getVar(const Common::String &varName) {
+	return properties[varName];
+}
+
 void LM::m_dispose(int nargs) {
 	g_lingo->printSTUBWithArglist("m_dispose", nargs);
 	g_lingo->dropStack(nargs);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 1f0442fb86..ad568f4641 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -149,6 +149,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 	_currentScriptType = kMovieScript;
 	_currentScriptContext = nullptr;
 	_currentScriptFunction = 0;
+	_currentMeObj = nullptr;
 
 	_currentEntityId = 0;
 	_currentChannelId = -1;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a37a901ca7..4779d5b7eb 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -257,7 +257,9 @@ struct Object {
     DatumArray *objArray;
 
 	Object *clone();
-	Symbol getMethod(Common::String &methodName, bool ignorePredefined = false);
+	Symbol getMethod(const Common::String &methodName, bool ignorePredefined = false);
+	bool hasVar(const Common::String &varName);
+	Symbol &getVar(const Common::String &varName);
 };
 
 struct CFrame {	/* proc/func call stack frame */


Commit: ccba7503e0c72f3d7fc109f702c28b158aec9a8d
    https://github.com/scummvm/scummvm/commit/ccba7503e0c72f3d7fc109f702c28b158aec9a8d
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement me

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-codegen.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 885013eeba..ac6b9647b8 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -354,14 +354,6 @@ void LC::c_varpush() {
 		return;
 	}
 
-	if (name.equalsIgnoreCase("me")) {
-		warning("c_varpush: ME");
-	}
-
-	if (name.equalsIgnoreCase("ancestor")) {
-		warning("c_varpush: ANCESTOR");
-	}
-
 	// Looking for the cast member constants
 	if (g_director->getVersion() < 4) { // TODO: There could be a flag 'Allow Outdated Lingo' in Movie Info in D4
 		int val = castNumToNum(name.c_str());
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index f06ed50847..ea5ec5443a 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -588,6 +588,11 @@ Datum Lingo::varFetch(Datum &var, bool global) {
 		Symbol *sym = nullptr;
 		Common::String name = *var.u.s;
 
+		if (_currentMeObj != nullptr && name.equalsIgnoreCase("me")) {
+			result.type = OBJECT;
+			result.u.obj = _currentMeObj;
+			return result;
+		}
 		if (_localvars && _localvars->contains(name)) {
 			sym = &(*_localvars)[name];
 			if (global)


Commit: e39fa921786ae2fbecd1e1e2b35f7762ef3ba7f5
    https://github.com/scummvm/scummvm/commit/e39fa921786ae2fbecd1e1e2b35f7762ef3ba7f5
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement object array

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index ea5ec5443a..9a2d6f0195 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -661,7 +661,7 @@ void Lingo::codeFactory(Common::String &name) {
 	obj->type = kFactoryObj;
 	obj->inheritanceLevel = 1;
 	obj->scriptContext = _currentScriptContext;
-	obj->objArray = new DatumArray; 
+	obj->objArray = new Common::HashMap<uint32, Datum>; 
 
 	_currentFactory = obj;
 	if (!_globalvars.contains(name)) {
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 1d10017d7e..95e6aac66e 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -83,7 +83,7 @@ Object *Object::clone() {
 	res->inheritanceLevel = inheritanceLevel + 1;
 	res->scriptContext = scriptContext;
 	if (objArray) {
-		res->objArray = new DatumArray(*objArray);
+		res->objArray = new Common::HashMap<uint, Datum>(*objArray);
 	}
 	return res;
 }
@@ -119,15 +119,20 @@ void LM::m_dispose(int nargs) {
 }
 
 void LM::m_get(int nargs) {
-	g_lingo->printSTUBWithArglist("m_get", nargs);
-	g_lingo->dropStack(nargs);
-	g_lingo->pushVoid();
+	Datum indexD = g_lingo->pop();
+	uint index = MAX(0, indexD.asInt());
+	if (g_lingo->_currentMeObj->objArray->contains(index)) {
+		g_lingo->push((*g_lingo->_currentMeObj->objArray)[index]);
+	} else {
+		g_lingo->push(Datum(0));
+	}
 }
 
 void LM::m_put(int nargs) {
-	g_lingo->printSTUBWithArglist("m_put", nargs);
-	g_lingo->dropStack(nargs);
-	g_lingo->pushVoid();
+	Datum value = g_lingo->pop();
+	Datum indexD = g_lingo->pop();
+	uint index = MAX(0, indexD.asInt());
+	(*g_lingo->_currentMeObj->objArray)[index] = value;
 }
 
 void LM::m_new(int nargs) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 4779d5b7eb..cd65be5d9f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -254,7 +254,7 @@ struct Object {
     ScriptContext *scriptContext;
 
     // used only for factories
-    DatumArray *objArray;
+    Common::HashMap<uint, Datum> *objArray;
 
 	Object *clone();
 	Symbol getMethod(const Common::String &methodName, bool ignorePredefined = false);


Commit: c855e1ad6e23d065f7c307ee1b0fd43722b09bc2
    https://github.com/scummvm/scummvm/commit/c855e1ad6e23d065f7c307ee1b0fd43722b09bc2
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Add factory debugging

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 9a2d6f0195..e6e0c3f3d9 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -67,6 +67,8 @@ void Lingo::execute(uint pc) {
 		if (debugChannelSet(9, kDebugLingoExec)) {
 			debug("Vars before");
 			printAllVars();
+			if (_currentMeObj)
+				debug("me: %s", _currentMeObj->name->c_str());
 		}
 
 		debugC(1, kDebugLingoExec, "[%3d]: %s", current, instr.c_str());
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index ad568f4641..58beef6931 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -835,6 +835,14 @@ void Lingo::printAllVars() {
 	}
 	debugN("\n");
 
+	if (_currentMeObj) {
+		debugN("  Instance/property vars: ");
+		for (SymbolHash::iterator i = _currentMeObj->properties.begin(); i != _currentMeObj->properties.end(); ++i) {
+			debugN("%s, ", (*i)._key.c_str());
+		}
+		debugN("\n");
+	}
+
 	debugN("  Global vars: ");
 	for (SymbolHash::iterator i = _globalvars.begin(); i != _globalvars.end(); ++i) {
 		debugN("%s, ", (*i)._key.c_str());


Commit: 8274f76dee2daaa91d6d1d3fbf8569de774eba15
    https://github.com/scummvm/scummvm/commit/8274f76dee2daaa91d6d1d3fbf8569de774eba15
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Clean up factory code

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-code.h
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ac6b9647b8..2c12bb5fae 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1242,7 +1242,6 @@ void LC::call(const Common::String &name, int nargs) {
 	if (debugChannelSet(3, kDebugLingoExec))
 		g_lingo->printSTUBWithArglist(name.c_str(), nargs, "call:");
 
-	Symbol targetSym = Symbol();
 	Symbol funcSym = g_lingo->getHandler(name);
 
 	if (funcSym.type == VOID) {
@@ -1251,20 +1250,18 @@ void LC::call(const Common::String &name, int nargs) {
 		Datum d = g_lingo->varFetch(eventName);
 		if (d.type == OBJECT) {
 			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to %s", name.c_str(), d.u.obj->name->c_str());
-			targetSym = Symbol();
-			targetSym.type = OBJECT;
-			targetSym.u.obj = d.u.obj;
+			Object *target = d.u.obj;
+			Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
+			nargs -= 1;
+			funcSym = target->getMethod(*methodName.u.s);
+			call(funcSym, nargs, target);
+			return;
 		}
-		Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
-		nargs -= 1;
-		funcSym = targetSym.u.obj->getMethod(*methodName.u.s);
-		call(funcSym, nargs, targetSym);
-	} else {
-		call(funcSym, nargs);
 	}
+	call(funcSym, nargs);
 }
 
-void LC::call(const Symbol &funcSym, int nargs, const Symbol &targetSym) {
+void LC::call(const Symbol &funcSym, int nargs, Object *target) {
 	bool dropArgs = false;
 
 	if (funcSym.type == VOID) {
@@ -1302,11 +1299,11 @@ void LC::call(const Symbol &funcSym, int nargs, const Symbol &targetSym) {
 	if (funcSym.type == BLTIN || funcSym.type == FBLTIN || funcSym.type == RBLTIN) {
 		int stackSize = g_lingo->_stack.size() - nargs;
 
-		if (targetSym.type == OBJECT) {
+		if (target) {
 			// Only need to update the me obj
 			// Pushing an entire stack frame is not necessary
 			Object *retMeObj = g_lingo->_currentMeObj;
-			g_lingo->_currentMeObj = targetSym.u.obj;
+			g_lingo->_currentMeObj = target;
 			(*funcSym.u.bltin)(nargs);
 			g_lingo->_currentMeObj = retMeObj;
 		} else {
@@ -1382,6 +1379,12 @@ void LC::call(const Symbol &funcSym, int nargs, const Symbol &targetSym) {
 		}
 	}
 
+	if (target) {
+		g_lingo->_currentMeObj = target;
+	} else {
+		g_lingo->_currentMeObj = nullptr;
+	}
+
 	fp->sp = funcSym;
 
 	g_lingo->_callstack.push_back(fp);
@@ -1397,12 +1400,6 @@ void LC::call(const Symbol &funcSym, int nargs, const Symbol &targetSym) {
 	g_lingo->_archiveIndex = funcSym.archiveIndex;
 
 	g_lingo->_pc = 0;
-
-	if (targetSym.type == OBJECT) {
-		g_lingo->_currentMeObj = targetSym.u.obj;
-	} else {
-		g_lingo->_currentMeObj = nullptr;
-	}
 }
 
 void LC::c_procret() {
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index 01c1f4c873..21c642141d 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -116,7 +116,7 @@ namespace LC {
 	void c_jumpifz();
 	void c_call();
 
-	void call(const Symbol &targetSym, int nargs, const Symbol &funcSym = Symbol());
+	void call(const Symbol &targetSym, int nargs, Object *target = nullptr);
 	void call(const Common::String &name, int nargs);
 
 	void c_procret();
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 0fd9a36256..cc414c1d77 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -110,7 +110,7 @@ static void startDef() {
 	g_lingo->_methodVarsStash = g_lingo->_methodVars;
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
 
-	if (g_lingo->_currentFactory) {
+	if (g_lingo->_inFactory) {
 		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
@@ -131,7 +131,7 @@ static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
 		if (type == kVarInstance) {
-			if (g_lingo->_currentFactory) {
+			if (g_lingo->_inFactory) {
 				g_lingo->_currentFactory->properties[*s] = Symbol();
 				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
 			} else {
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 8005eb2612..6573bcfb00 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -93,7 +93,7 @@ static void startDef() {
 	g_lingo->_methodVarsStash = g_lingo->_methodVars;
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
 
-	if (g_lingo->_currentFactory) {
+	if (g_lingo->_inFactory) {
 		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
@@ -114,7 +114,7 @@ static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
 		if (type == kVarInstance) {
-			if (g_lingo->_currentFactory) {
+			if (g_lingo->_inFactory) {
 				g_lingo->_currentFactory->properties[*s] = Symbol();
 				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
 			} else {
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 95e6aac66e..b5b0ae9d6d 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -88,7 +88,7 @@ Object *Object::clone() {
 	return res;
 }
 
-Symbol Object::getMethod(const Common::String &methodName, bool ignorePredefined) {
+Symbol Object::getMethod(const Common::String methodName, bool ignorePredefined) {
 	if (!ignorePredefined && g_lingo->_methods.contains(methodName)) {
 		return g_lingo->_methods[methodName];
 	}
@@ -99,7 +99,7 @@ Symbol Object::getMethod(const Common::String &methodName, bool ignorePredefined
 	return Symbol();
 }
 
-bool Object::hasVar(const Common::String &varName) {
+bool Object::hasVar(const Common::String varName) {
 	// Factory object instance vars are accessed like normal vars
 	// Script object properties cannot be accessed like normal vars until D5
 	if (type == kScriptObj && g_lingo->_vm->getVersion() < 5) {
@@ -108,14 +108,13 @@ bool Object::hasVar(const Common::String &varName) {
 	return properties.contains(varName);
 }
 
-Symbol &Object::getVar(const Common::String &varName) {
+Symbol &Object::getVar(const Common::String varName) {
 	return properties[varName];
 }
 
 void LM::m_dispose(int nargs) {
 	g_lingo->printSTUBWithArglist("m_dispose", nargs);
 	g_lingo->dropStack(nargs);
-	g_lingo->pushVoid();
 }
 
 void LM::m_get(int nargs) {
@@ -139,13 +138,9 @@ void LM::m_new(int nargs) {
 	Object *clone = g_lingo->_currentMeObj->clone();
 
 	// Call user-defined mNew
-	Common::String methodName("mNew");
-	Symbol userMNew = clone->getMethod(methodName, true);
-	Symbol cloneSym;
-	cloneSym.type = OBJECT;
-	cloneSym.u.obj = clone;
+	Symbol userMNew = clone->getMethod("mNew", true);
 	if (userMNew.type != VOID) {
-		LC::call(userMNew, nargs, cloneSym);
+		LC::call(userMNew, nargs, clone);
 	}
 
 	Datum res;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index cd65be5d9f..c8b905bea6 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -257,9 +257,9 @@ struct Object {
     Common::HashMap<uint, Datum> *objArray;
 
 	Object *clone();
-	Symbol getMethod(const Common::String &methodName, bool ignorePredefined = false);
-	bool hasVar(const Common::String &varName);
-	Symbol &getVar(const Common::String &varName);
+	Symbol getMethod(const Common::String methodName, bool ignorePredefined = false);
+	bool hasVar(const Common::String varName);
+	Symbol &getVar(const Common::String varName);
 };
 
 struct CFrame {	/* proc/func call stack frame */


Commit: 5443cb2b320d6ba87597e067288dc226c3b09c13
    https://github.com/scummvm/scummvm/commit/5443cb2b320d6ba87597e067288dc226c3b09c13
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix user-defined mNew

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 650aebe929..9f05ce75f5 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1267,7 +1267,12 @@ void LB::b_quit(int nargs) {
 }
 
 void LB::b_return(int nargs) {
-	// We do not touch the top of the stack, it will be returned
+	CFrame *fp = g_lingo->_callstack.back();
+	// Do not allow a factory's mNew method to return a value
+	// Otherwise do not touch the top of the stack, it will be returned
+	if (g_lingo->_currentMeObj && g_lingo->_currentMeObj->type == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
+		g_lingo->pop();
+	}
 	LC::c_procret();
 }
 
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 2c12bb5fae..ec529a51f0 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1253,6 +1253,9 @@ void LC::call(const Common::String &name, int nargs) {
 			Object *target = d.u.obj;
 			Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
 			nargs -= 1;
+			if (methodName.u.s->equalsIgnoreCase("mNew")) {
+				target = target->clone();
+			}
 			funcSym = target->getMethod(*methodName.u.s);
 			call(funcSym, nargs, target);
 			return;
@@ -1414,6 +1417,14 @@ void LC::c_procret() {
 	CFrame *fp = g_lingo->_callstack.back();
 	g_lingo->_callstack.pop_back();
 
+	if (g_lingo->_currentMeObj && g_lingo->_currentMeObj->type == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
+		// Return the newly created object after executing mNew
+		Datum d;
+		d.type = OBJECT;
+		d.u.obj = g_lingo->_currentMeObj;
+		g_lingo->push(d);
+	}
+
 	g_lingo->_currentScript = fp->retscript;
 	g_lingo->_currentScriptContext = fp->retctx;
 	g_lingo->_archiveIndex = fp->retarchive;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index b5b0ae9d6d..a998679839 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -88,13 +88,13 @@ Object *Object::clone() {
 	return res;
 }
 
-Symbol Object::getMethod(const Common::String methodName, bool ignorePredefined) {
-	if (!ignorePredefined && g_lingo->_methods.contains(methodName)) {
-		return g_lingo->_methods[methodName];
-	}
+Symbol Object::getMethod(const Common::String methodName) {
 	if (methods.contains(methodName)) {
 		return methods[methodName];
 	}
+	if (g_lingo->_methods.contains(methodName)) {
+		return g_lingo->_methods[methodName];
+	}
 	// TODO: error handling
 	return Symbol();
 }
@@ -135,17 +135,10 @@ void LM::m_put(int nargs) {
 }
 
 void LM::m_new(int nargs) {
-	Object *clone = g_lingo->_currentMeObj->clone();
-
-	// Call user-defined mNew
-	Symbol userMNew = clone->getMethod("mNew", true);
-	if (userMNew.type != VOID) {
-		LC::call(userMNew, nargs, clone);
-	}
-
+	// This is usually be overridden by a user-defined mNew
 	Datum res;
 	res.type = OBJECT;
-	res.u.obj = clone;
+	res.u.obj = g_lingo->_currentMeObj;
 	g_lingo->push(res);
 }
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index c8b905bea6..9e009a74ed 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -257,7 +257,7 @@ struct Object {
     Common::HashMap<uint, Datum> *objArray;
 
 	Object *clone();
-	Symbol getMethod(const Common::String methodName, bool ignorePredefined = false);
+	Symbol getMethod(const Common::String methodName);
 	bool hasVar(const Common::String varName);
 	Symbol &getVar(const Common::String varName);
 };


Commit: 964b3eddc28b2a2d054e63dc9d7a4a94ce4c6aab
    https://github.com/scummvm/scummvm/commit/964b3eddc28b2a2d054e63dc9d7a4a94ce4c6aab
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement m_dispose

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index e6e0c3f3d9..85131ce162 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -661,6 +661,7 @@ void Lingo::codeFactory(Common::String &name) {
 	Object *obj = new Object;
 	obj->name = new Common::String(name);
 	obj->type = kFactoryObj;
+	obj->disposed = false;
 	obj->inheritanceLevel = 1;
 	obj->scriptContext = _currentScriptContext;
 	obj->objArray = new Common::HashMap<uint32, Datum>; 
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index a998679839..23347df311 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -77,6 +77,7 @@ Object *Object::clone() {
 	Object *res = new Object;
 	res->name = name;
 	res->type = type;
+	res->disposed = disposed;
 	res->prototype = this;
 	res->properties = properties;
 	res->methods = methods;
@@ -89,17 +90,22 @@ Object *Object::clone() {
 }
 
 Symbol Object::getMethod(const Common::String methodName) {
+	if (disposed) {
+		error("Method '%s' called on disposed object '%s'", methodName.c_str(), name->c_str());
+	}
 	if (methods.contains(methodName)) {
 		return methods[methodName];
 	}
 	if (g_lingo->_methods.contains(methodName)) {
 		return g_lingo->_methods[methodName];
 	}
-	// TODO: error handling
 	return Symbol();
 }
 
 bool Object::hasVar(const Common::String varName) {
+	if (disposed) {
+		error("Variable '%s' accessed on disposed object '%s'", varName.c_str(), name->c_str());
+	}
 	// Factory object instance vars are accessed like normal vars
 	// Script object properties cannot be accessed like normal vars until D5
 	if (type == kScriptObj && g_lingo->_vm->getVersion() < 5) {
@@ -113,8 +119,7 @@ Symbol &Object::getVar(const Common::String varName) {
 }
 
 void LM::m_dispose(int nargs) {
-	g_lingo->printSTUBWithArglist("m_dispose", nargs);
-	g_lingo->dropStack(nargs);
+	g_lingo->_currentMeObj->disposed = true;
 }
 
 void LM::m_get(int nargs) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 9e009a74ed..e347a86268 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -246,6 +246,7 @@ enum ObjectType {
 struct Object {
 	Common::String *name;
     ObjectType type;
+	bool disposed;
 
     Object *prototype;
     SymbolHash properties;


Commit: f0e598e402fc02e89ac720156fe18ca3a7bd8573
    https://github.com/scummvm/scummvm/commit/f0e598e402fc02e89ac720156fe18ca3a7bd8573
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix b_objectp

Changed paths:
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 9f05ce75f5..f5e8c7c544 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1323,7 +1323,16 @@ void LB::b_integerp(int nargs) {
 
 void LB::b_objectp(int nargs) {
 	Datum d = g_lingo->pop();
-	Datum res ((d.type == OBJECT) ? 1 : 0);
+	Datum res;
+	if (d.type == OBJECT) {
+		if (d.u.obj->type == kFactoryObj && (d.u.obj->inheritanceLevel == 1 || d.u.obj->disposed)) {
+			res = 0;
+		} else {
+			res = 1;
+		}
+	} else {
+		res = 0;
+	}
 	g_lingo->push(res);
 }
 


Commit: 516d2ef17f84a0d582bc1e336b067973242da455
    https://github.com/scummvm/scummvm/commit/516d2ef17f84a0d582bc1e336b067973242da455
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement kThePerFrameHook

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/score.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 85fa301a85..123d955666 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -468,7 +468,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.u.i = g_system->getEventManager()->getButtonState() & (1 << Common::MOUSE_BUTTON_LEFT | 1 << Common::MOUSE_BUTTON_RIGHT) ? 0 : 1;
 		break;
 	case kThePerFrameHook:
-		warning("STUB: Lingo::getTheEntity(): getting the perframehook");
+		d = _perFrameHook;
 		break;
 	case kThePi:
 		d.type = FLOAT;
@@ -553,7 +553,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		_floatPrecisionFormat = Common::String::format("%%.%df", _floatPrecision);
 		break;
 	case kThePerFrameHook:
-		warning("STUB: Lingo::setTheEntity(): setting the perframehook");
+		_perFrameHook = d;
 		break;
 	case kTheSoundEntity:
 		{
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 58beef6931..1bb061056c 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -181,6 +181,8 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 
 	_archiveIndex = 0;
 
+	_perFrameHook = Datum();
+
 	initEventHandlerTypes();
 
 	initBuiltIns();
@@ -828,6 +830,22 @@ void Lingo::executeImmediateScripts(Frame *frame) {
 	}
 }
 
+void Lingo::executePerFrameHook() {
+	// TODO: Call with arguments
+	if (_perFrameHook.type == OBJECT) {
+		Symbol method = _perFrameHook.u.obj->getMethod("mAtFrame");
+		if (method.type != VOID) {
+			_localvars = new SymbolHash;
+
+			debugC(1, kDebugLingoExec, "Executing mAtFrame on perFrameHook : %s", _perFrameHook.u.obj->name->c_str());
+			LC::call(method, 0, _perFrameHook.u.obj);
+			execute(_pc);
+
+			cleanLocalVars();
+		}
+	}
+}
+
 void Lingo::printAllVars() {
 	debugN("  Local vars: ");
 	for (SymbolHash::iterator i = _localvars->begin(); i != _localvars->end(); ++i) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index e347a86268..16ff91232c 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -538,8 +538,11 @@ public:
 
 	bool _dontPassEvent;
 
+	Datum _perFrameHook;
+
 public:
 	void executeImmediateScripts(Frame *frame);
+	void executePerFrameHook();
 };
 
 extern Lingo *g_lingo;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index f86643876a..4b61f25f78 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -430,6 +430,7 @@ void Score::update() {
 	// _surface->copyFrom(*_trailSurface);
 
 	_lingo->executeImmediateScripts(_frames[_currentFrame]);
+	_lingo->executePerFrameHook();
 
 	if (_vm->getVersion() >= 6) {
 		_lingo->processEvent(kEventBeginSprite);


Commit: 4e4f26f96309cceeb20274df34f0fa7202a42d30
    https://github.com/scummvm/scummvm/commit/4e4f26f96309cceeb20274df34f0fa7202a42d30
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix var assign/fetch with obj val

Changed paths:
    engines/director/lingo/lingo-codegen.cpp


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 85131ce162..061a03f840 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -543,12 +543,14 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global) {
 			sym->u.i = value.u.i;
 		} else if (value.type == FLOAT) {
 			sym->u.f = value.u.f;
-		} else if (value.type == STRING || value.type == SYMBOL || value.type == OBJECT) {
+		} else if (value.type == STRING || value.type == SYMBOL) {
 			sym->u.s = value.u.s;
 		} else if (value.type == POINT || value.type == ARRAY) {
 			sym->u.farr = value.u.farr;
 		} else if (value.type == PARRAY) {
 			sym->u.parr = value.u.parr;
+		} else if (value.type == OBJECT) {
+			sym->u.obj = value.u.obj;
 		} else if (value.type == VOID) {
 			sym->u.i = 0;
 		} else {
@@ -623,12 +625,14 @@ Datum Lingo::varFetch(Datum &var, bool global) {
 			result.u.i = sym->u.i;
 		else if (sym->type == FLOAT)
 			result.u.f = sym->u.f;
-		else if (sym->type == STRING || sym->type == SYMBOL || sym->type == OBJECT)
+		else if (sym->type == STRING || sym->type == SYMBOL)
 			result.u.s = sym->u.s;
 		else if (sym->type == POINT || sym->type == ARRAY)
 			result.u.farr = sym->u.farr;
 		else if (sym->type == PARRAY)
 			result.u.parr = sym->u.parr;
+		else if (sym->type == OBJECT)
+			result.u.obj = sym->u.obj;
 		else if (sym->type == VOID)
 			result.u.i = 0;
 		else {


Commit: 47f19d8515df5fd76967234590bb3b9dc85935aa
    https://github.com/scummvm/scummvm/commit/47f19d8515df5fd76967234590bb3b9dc85935aa
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix extra arg warning on method

Changed paths:
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y


diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index cc414c1d77..ae25c183b5 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -3294,7 +3294,7 @@ yyreduce:
 #line 690 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, g_lingo->_currentFactory);
+		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
 #line 3301 "engines/director/lingo/lingo-gr.cpp"
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 6573bcfb00..e52459bb76 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -689,7 +689,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
 	| tMETHOD { startDef(); }
 			lbl argdef '\n' argstore stmtlist 		{
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1, g_lingo->_currentFactory);
+		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef, g_lingo->_currentFactory);
 		endDef();
 		delete $tMETHOD; }
 	| on lbl argdef '\n' argstore stmtlist ENDCLAUSE endargdef {	// D3


Commit: 5de9a9816e832e796c3819127f1fea4b08c557ac
    https://github.com/scummvm/scummvm/commit/5de9a9816e832e796c3819127f1fea4b08c557ac
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Lazy evaluate first ID in arglist

This avoids conflicts between variable names and method names.

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-code.h
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ec529a51f0..8d47d3d067 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -94,6 +94,7 @@ static struct FuncDescr {
 	{ LC::c_itemToOf,		"c_itemToOf",		"" },	// D3
 	{ LC::c_jump,			"c_jump",			"o" },
 	{ LC::c_jumpifz,		"c_jumpifz",		"o" },
+	{ LC::c_lazyeval,		"c_lazyeval",			"s" },
 	{ LC::c_le,				"c_le",				"" },
 	{ LC::c_lineOf,			"c_lineOf",			"" },	// D3
 	{ LC::c_lineToOf,		"c_lineToOf",		"" },	// D3
@@ -192,6 +193,9 @@ Datum Lingo::pop(void) {
 
 	Datum ret = _stack.back();
 	_stack.pop_back();
+	if (ret.lazy) {
+		ret = ret.eval();
+	}
 
 	return ret;
 }
@@ -424,6 +428,15 @@ void LC::c_eval() {
 	g_lingo->push(d);
 }
 
+void LC::c_lazyeval() {
+	LC::c_varpush();
+
+	Datum d;
+	d = g_lingo->pop();
+	d.lazy = true;
+	g_lingo->push(d);
+}
+
 void LC::c_theentitypush() {
 	Datum id = g_lingo->pop();
 
@@ -1344,7 +1357,7 @@ void LC::call(const Symbol &funcSym, int nargs, Object *target) {
 	fp->retMeObj = g_lingo->_currentMeObj;
 
 	// Create new set of local variables
-	g_lingo->_localvars = new SymbolHash;
+	SymbolHash *localvars = new SymbolHash;
 	if (funcSym.argNames) {
 		int symNArgs = funcSym.nargs;
 		if ((int)funcSym.argNames->size() < symNArgs) {
@@ -1359,28 +1372,30 @@ void LC::call(const Symbol &funcSym, int nargs, Object *target) {
 		}
 		for (int i = symNArgs - 1; i >= 0; i--) {
 			Common::String name = (*funcSym.argNames)[i];
-			if (!g_lingo->_localvars->contains(name)) {
-				g_lingo->varCreate(name, false);
+			if (!localvars->contains(name)) {
+				g_lingo->varCreate(name, false, localvars);
 				Datum arg(name);
 				arg.type = VAR;
 				Datum value = g_lingo->pop();
-				g_lingo->varAssign(arg, value);
+				g_lingo->varAssign(arg, value, false, localvars);
 			} else {
 				warning("Argument %s already defined", name.c_str());
+				g_lingo->pop();
 			}
 		}
 	}
 	if (funcSym.varNames) {
 		for (Common::Array<Common::String>::iterator it = funcSym.varNames->begin(); it != funcSym.varNames->end(); ++it) {
 			Common::String name = *it;
-			if (!g_lingo->_localvars->contains(name)) {
-				(*g_lingo->_localvars)[name] = Symbol();
-				(*g_lingo->_localvars)[name].name = new Common::String(name);
+			if (!localvars->contains(name)) {
+				(*localvars)[name] = Symbol();
+				(*localvars)[name].name = new Common::String(name);
 			} else {
 				warning("Variable %s already defined", name.c_str());
 			}
 		}
 	}
+	g_lingo->_localvars = localvars;
 
 	if (target) {
 		g_lingo->_currentMeObj = target;
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index 21c642141d..d2cb192b25 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -82,6 +82,7 @@ namespace LC {
 	void c_assign();
 	bool verify(const Symbol &s);
 	void c_eval();
+	void c_lazyeval();
 	void c_setImmediate();
 
 	void c_swap();
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 061a03f840..b0dd6c01a5 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -253,14 +253,6 @@ Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::
 			warning("Redefining method '%s' on factory '%s'", name.c_str(), factory->name->c_str());
 		}
 		factory->methods[name] = sym;
-
-		// FIXME: Method names can conflict with vars. This won't work all the time.
-		Datum target(name);
-		target.type = VAR;
-		Datum source(name);
-		source.type = SYMBOL;
-		g_lingo->varCreate(name, true);
-		g_lingo->varAssign(target, source, true);
 	} else {
 		Symbol existing = getHandler(name);
 		if (existing.type != VOID)
@@ -474,8 +466,12 @@ int Lingo::castIdFetch(Datum &var) {
 	return id;
 }
 
-void Lingo::varCreate(const Common::String &name, bool global) {
-	if (_localvars && _localvars->contains(name)) {
+void Lingo::varCreate(const Common::String &name, bool global, SymbolHash *localvars) {
+	if (localvars == nullptr) {
+		localvars = _localvars;
+	}
+
+	if (localvars && localvars->contains(name)) {
 		if (global)
 			warning("varCreate: variable %s is local, not global", name.c_str());
 		return;
@@ -493,12 +489,16 @@ void Lingo::varCreate(const Common::String &name, bool global) {
 		_globalvars[name] = Symbol();
 		_globalvars[name].name = new Common::String(name);
 	} else {
-		(*_localvars)[name] = Symbol();
-		(*_localvars)[name].name = new Common::String(name);
+		(*localvars)[name] = Symbol();
+		(*localvars)[name].name = new Common::String(name);
 	}
 }
 
-void Lingo::varAssign(Datum &var, Datum &value, bool global) {
+void Lingo::varAssign(Datum &var, Datum &value, bool global, SymbolHash *localvars) {
+	if (localvars == nullptr) {
+		localvars = _localvars;
+	}
+
 	if (var.type != VAR && var.type != REFERENCE) {
 		warning("varAssign: assignment to non-variable");
 		return;
@@ -508,8 +508,8 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global) {
 		Symbol *sym = nullptr;
 		Common::String name = *var.u.s;
 
-		if (_localvars && _localvars->contains(name)) {
-			sym = &(*_localvars)[name];
+		if (localvars && localvars->contains(name)) {
+			sym = &(*localvars)[name];
 			if (global)
 				warning("varAssign: variable %s is local, not global", name.c_str());
 		} else if (_currentMeObj && _currentMeObj->hasVar(name)) {
@@ -580,7 +580,11 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global) {
 	}
 }
 
-Datum Lingo::varFetch(Datum &var, bool global) {
+Datum Lingo::varFetch(Datum &var, bool global, SymbolHash *localvars) {
+	if (localvars == nullptr) {
+		localvars = _localvars;
+	}
+
 	Datum result;
 	result.type = VOID;
 	if (var.type != VAR && var.type != REFERENCE) {
@@ -597,8 +601,8 @@ Datum Lingo::varFetch(Datum &var, bool global) {
 			result.u.obj = _currentMeObj;
 			return result;
 		}
-		if (_localvars && _localvars->contains(name)) {
-			sym = &(*_localvars)[name];
+		if (localvars && localvars->contains(name)) {
+			sym = &(*localvars)[name];
 			if (global)
 				warning("varFetch: variable %s is local, not global", sym->name->c_str());
 		} else if (_currentMeObj && _currentMeObj->hasVar(name)) {
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index ae25c183b5..5157aaefa2 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -447,36 +447,37 @@ enum yysymbol_kind_t
   YYSYMBOL_stmtlist = 127,                 /* stmtlist  */
   YYSYMBOL_simpleexpr = 128,               /* simpleexpr  */
   YYSYMBOL_expr = 129,                     /* expr  */
-  YYSYMBOL_chunkexpr = 130,                /* chunkexpr  */
-  YYSYMBOL_reference = 131,                /* reference  */
-  YYSYMBOL_proc = 132,                     /* proc  */
-  YYSYMBOL_133_10 = 133,                   /* $@10  */
+  YYSYMBOL_130_10 = 130,                   /* $@10  */
+  YYSYMBOL_chunkexpr = 131,                /* chunkexpr  */
+  YYSYMBOL_reference = 132,                /* reference  */
+  YYSYMBOL_proc = 133,                     /* proc  */
   YYSYMBOL_134_11 = 134,                   /* $@11  */
   YYSYMBOL_135_12 = 135,                   /* $@12  */
-  YYSYMBOL_globallist = 136,               /* globallist  */
-  YYSYMBOL_propertylist = 137,             /* propertylist  */
-  YYSYMBOL_instancelist = 138,             /* instancelist  */
-  YYSYMBOL_gotofunc = 139,                 /* gotofunc  */
-  YYSYMBOL_gotomovie = 140,                /* gotomovie  */
-  YYSYMBOL_playfunc = 141,                 /* playfunc  */
-  YYSYMBOL_142_13 = 142,                   /* $@13  */
-  YYSYMBOL_defn = 143,                     /* defn  */
-  YYSYMBOL_144_14 = 144,                   /* $@14  */
+  YYSYMBOL_136_13 = 136,                   /* $@13  */
+  YYSYMBOL_globallist = 137,               /* globallist  */
+  YYSYMBOL_propertylist = 138,             /* propertylist  */
+  YYSYMBOL_instancelist = 139,             /* instancelist  */
+  YYSYMBOL_gotofunc = 140,                 /* gotofunc  */
+  YYSYMBOL_gotomovie = 141,                /* gotomovie  */
+  YYSYMBOL_playfunc = 142,                 /* playfunc  */
+  YYSYMBOL_143_14 = 143,                   /* $@14  */
+  YYSYMBOL_defn = 144,                     /* defn  */
   YYSYMBOL_145_15 = 145,                   /* $@15  */
   YYSYMBOL_146_16 = 146,                   /* $@16  */
-  YYSYMBOL_on = 147,                       /* on  */
-  YYSYMBOL_148_17 = 148,                   /* $@17  */
-  YYSYMBOL_argdef = 149,                   /* argdef  */
-  YYSYMBOL_endargdef = 150,                /* endargdef  */
-  YYSYMBOL_argstore = 151,                 /* argstore  */
-  YYSYMBOL_macro = 152,                    /* macro  */
-  YYSYMBOL_arglist = 153,                  /* arglist  */
-  YYSYMBOL_nonemptyarglist = 154,          /* nonemptyarglist  */
-  YYSYMBOL_list = 155,                     /* list  */
-  YYSYMBOL_valuelist = 156,                /* valuelist  */
-  YYSYMBOL_linearlist = 157,               /* linearlist  */
-  YYSYMBOL_proplist = 158,                 /* proplist  */
-  YYSYMBOL_proppair = 159                  /* proppair  */
+  YYSYMBOL_147_17 = 147,                   /* $@17  */
+  YYSYMBOL_on = 148,                       /* on  */
+  YYSYMBOL_149_18 = 149,                   /* $@18  */
+  YYSYMBOL_argdef = 150,                   /* argdef  */
+  YYSYMBOL_endargdef = 151,                /* endargdef  */
+  YYSYMBOL_argstore = 152,                 /* argstore  */
+  YYSYMBOL_macro = 153,                    /* macro  */
+  YYSYMBOL_arglist = 154,                  /* arglist  */
+  YYSYMBOL_nonemptyarglist = 155,          /* nonemptyarglist  */
+  YYSYMBOL_list = 156,                     /* list  */
+  YYSYMBOL_valuelist = 157,                /* valuelist  */
+  YYSYMBOL_linearlist = 158,               /* linearlist  */
+  YYSYMBOL_proplist = 159,                 /* proplist  */
+  YYSYMBOL_proppair = 160                  /* proppair  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -786,16 +787,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  125
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2546
+#define YYLAST   2585
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  103
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  57
+#define YYNNTS  58
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  174
+#define YYNRULES  177
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  363
+#define YYNSTATES  369
 
 #define YYMAXUTOK   342
 
@@ -859,17 +860,17 @@ static const yytype_int16 yyrline[] =
      410,   411,   413,   415,   422,   430,   431,   433,   439,   443,
      447,   451,   454,   456,   457,   458,   460,   463,   466,   470,
      474,   478,   486,   492,   493,   494,   505,   506,   507,   510,
-     513,   516,   519,   524,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
-     546,   547,   548,   549,   550,   551,   552,   554,   555,   556,
-     557,   558,   559,   560,   561,   563,   566,   568,   569,   570,
-     571,   572,   573,   573,   574,   574,   575,   575,   576,   579,
-     582,   583,   585,   590,   596,   601,   607,   610,   621,   622,
-     623,   624,   628,   632,   637,   638,   640,   644,   648,   652,
-     652,   682,   682,   682,   688,   689,   689,   695,   703,   709,
-     709,   712,   713,   714,   716,   717,   718,   720,   722,   730,
-     731,   732,   734,   735,   737,   739,   740,   741,   742,   744,
-     745,   747,   748,   750,   754
+     513,   519,   519,   524,   527,   530,   535,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   552,   553,
+     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
+     565,   566,   567,   568,   569,   570,   571,   572,   574,   577,
+     579,   580,   581,   582,   583,   584,   584,   585,   585,   586,
+     586,   587,   590,   593,   594,   596,   601,   607,   612,   618,
+     621,   632,   633,   634,   635,   639,   643,   648,   649,   651,
+     655,   659,   663,   663,   693,   693,   693,   699,   700,   700,
+     706,   714,   720,   720,   723,   724,   725,   727,   728,   729,
+     731,   733,   741,   742,   743,   745,   746,   748,   750,   751,
+     752,   753,   755,   756,   758,   759,   761,   765
 };
 #endif
 
@@ -904,10 +905,10 @@ yysymbol_name (yysymbol_kind_t yysymbol)
   "$accept", "program", "programline", "asgn", "stmtoneliner", "stmt",
   "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9",
   "tellstart", "ifstmt", "elseifstmtlist", "elseifstmt", "jumpifz", "jump",
-  "varassign", "if", "lbl", "stmtlist", "simpleexpr", "expr", "chunkexpr",
-  "reference", "proc", "$@10", "$@11", "$@12", "globallist",
+  "varassign", "if", "lbl", "stmtlist", "simpleexpr", "expr", "$@10",
+  "chunkexpr", "reference", "proc", "$@11", "$@12", "$@13", "globallist",
   "propertylist", "instancelist", "gotofunc", "gotomovie", "playfunc",
-  "$@13", "defn", "$@14", "$@15", "$@16", "on", "$@17", "argdef",
+  "$@14", "defn", "$@15", "$@16", "$@17", "on", "$@18", "argdef",
   "endargdef", "argstore", "macro", "arglist", "nonemptyarglist", "list",
   "valuelist", "linearlist", "proplist", "proppair", YY_NULLPTR
   };
@@ -934,12 +935,12 @@ static const yytype_int16 yytoknum[] =
 };
 #endif
 
-#define YYPACT_NINF (-293)
+#define YYPACT_NINF (-300)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-166)
+#define YYTABLE_NINF (-169)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -948,43 +949,43 @@ static const yytype_int16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     767,   -91,  -293,  -293,    53,  -293,   591,   310,    53,   -38,
-     493,  -293,  -293,  -293,  -293,  -293,  -293,   -37,  -293,   225,
-    -293,  -293,  -293,   -26,  1899,    36,   173,    26,    33,  1929,
-    1775,  -293,  1929,  1929,  1929,  1929,  1929,  1929,  1929,  -293,
-    -293,  1929,  1929,  1929,   404,    39,   -28,  -293,  -293,  -293,
-    -293,  1929,  -293,  2439,  -293,  -293,  -293,  -293,  -293,  -293,
-    -293,  -293,  -293,  -293,  -293,  -293,   -12,  1899,  1812,  2439,
-     -10,  1812,   -10,  -293,    53,  1812,  2439,    -2,   679,  -293,
-    -293,    87,  1929,  -293,    68,  -293,  2020,  -293,    89,  -293,
-      90,  1987,    91,  -293,   -20,    53,    53,   -11,    64,    66,
-    -293,  2356,  2020,  -293,    94,  -293,  2053,  2086,  2119,  2152,
-    2406,  2317,   113,   116,  -293,  -293,  2369,    41,    43,  -293,
-    2439,    45,    48,    50,  -293,  -293,   767,  2439,  1929,  1929,
-    1929,  1929,  1929,  1929,  1929,  1929,  1929,  1929,  1929,  1929,
-    1929,  1929,  1929,  1929,  1929,   125,  1812,  1987,  2369,   -51,
-    1929,    -3,  -293,    11,  1929,   -10,   125,  -293,    57,  2439,
-    1929,  -293,  -293,    53,    25,  1929,  1929,   -22,  1929,  1929,
-    1929,    -4,   104,  1929,  1929,  1929,  1929,  1929,  -293,  -293,
-      58,  1929,  1929,  1929,  1929,  1929,  1929,  1929,  1929,  1929,
-    1929,  -293,  -293,  -293,    59,  -293,  -293,    53,    53,  -293,
-    1929,    46,  -293,   108,    14,    14,    14,    14,  2452,  2452,
-    -293,   -36,    14,    14,    14,    14,   -36,   -53,   -53,  -293,
-    -293,  -293,   -87,  -293,  2439,  -293,  -293,  2439,   -33,   139,
-    2439,  -293,   129,  -293,  -293,  2439,  2439,  1929,  1929,  2439,
-    2439,    14,  1929,  1929,   148,  2439,    14,  2439,  2439,  2439,
-     159,  2439,  2185,  2439,  2218,  2439,  2251,  2439,  2284,  2439,
-    2439,  1694,  -293,   160,  -293,  -293,  2439,    41,    43,  -293,
-    -293,  -293,   161,  -293,  -293,   125,  1929,  2439,   377,  -293,
-    2439,    14,    53,  -293,  1929,  1929,  1929,  1929,  -293,  1189,
-    -293,  1104,  -293,  -293,  -293,    -9,  2439,  -293,  -293,  -293,
-    1273,   135,  2439,  2439,  2439,  2439,  -293,  -293,  -293,   106,
-    -293,   852,   936,  -293,  -293,  -293,  -293,   109,  1929,  -293,
-      75,   170,  -293,  -293,   143,   167,  -293,  2439,  -293,  1929,
-    -293,   118,  -293,   110,  1020,  -293,  1929,   151,  1357,  2439,
-    -293,   181,  -293,  2439,  1929,   123,   157,  -293,  1442,  -293,
-    2439,  -293,  -293,  -293,  -293,  -293,  1104,  1526,  -293,  -293,
-    -293,  1610,  -293
+     773,   -82,  -300,  -300,    53,  -300,   597,   316,    53,    -2,
+     499,  -300,  -300,  -300,  -300,  -300,  -300,     9,  -300,  1781,
+    -300,  -300,  -300,    22,  2023,   -17,    85,    57,    63,  2053,
+    1818,  -300,  2053,  2053,  2053,  2053,  2053,  2053,  2053,  -300,
+    -300,  2053,  2053,  2053,   410,    96,     5,  -300,  -300,  -300,
+    -300,  2053,  -300,  2478,  -300,  -300,  -300,  -300,  -300,  -300,
+    -300,  -300,  -300,  -300,  -300,  -300,     8,  2023,  1899,  2478,
+      46,  1899,    46,  -300,    53,  1936,  2478,    47,   685,  -300,
+    -300,    88,  2053,  -300,    69,  -300,  2092,  -300,    95,  -300,
+     121,   402,   122,  -300,   -42,    53,    53,   -20,    97,    99,
+    -300,  2395,  2092,  -300,   128,  -300,  2125,  2158,  2191,  2224,
+    2445,   164,   130,   132,  -300,  -300,  2408,    60,    64,  -300,
+    2478,    58,    75,    89,  -300,  -300,   773,  2478,  2053,  2053,
+    2053,  2053,  2053,  2053,  2053,  2053,  2053,  2053,  2053,  2053,
+    2053,  2053,  2053,  2053,  2053,   149,  1936,   402,  2408,   -46,
+    2053,    18,  -300,   -89,    21,  2053,    46,   149,  -300,    91,
+    2478,  2053,  -300,  -300,    53,    17,  2053,  2053,   -22,  2053,
+    2053,  2053,    14,   139,  2053,  2053,  2053,  2053,  2053,  -300,
+    -300,    92,  2053,  2053,  2053,  2053,  2053,  2053,  2053,  2053,
+    2053,  2053,  -300,  -300,  -300,    93,  -300,  -300,    53,    53,
+    -300,  2053,    37,  -300,   140,    16,    16,    16,    16,  2491,
+    2491,  -300,   -36,    16,    16,    16,    16,   -36,   -44,   -44,
+    -300,  -300,  -300,   -48,  -300,  2478,  -300,  -300,  -300,  -300,
+    2478,    -9,   168,  2478,  -300,   153,  -300,  -300,  2478,  2478,
+    2053,  2053,  2478,  2478,    16,  2053,  2053,   172,  2478,    16,
+    2478,  2478,  2478,   174,  2478,  2257,  2478,  2290,  2478,  2323,
+    2478,  2356,  2478,  2478,  1700,  -300,   177,  -300,  -300,  2478,
+      60,    64,  -300,  -300,  -300,   178,  2053,  -300,  -300,   149,
+    2053,  2478,   231,  -300,  2478,    16,    53,  -300,  2053,  2053,
+    2053,  2053,  -300,  1195,  -300,  1110,  -300,  -300,    44,  -300,
+       1,  2478,  -300,  -300,  -300,  1279,   152,  2478,  2478,  2478,
+    2478,  -300,  -300,  -300,   120,  -300,   858,  -300,   942,  -300,
+    -300,  -300,  -300,   124,  2053,  -300,    76,   182,  -300,  -300,
+     157,   179,  -300,  2478,  -300,  2053,  -300,   134,  -300,   114,
+    1026,  -300,  2053,   163,  1363,  2478,  -300,   194,  -300,  2478,
+    2053,   136,   169,  -300,  1448,  -300,  2478,  -300,  -300,  -300,
+    -300,  -300,  1110,  1532,  -300,  -300,  -300,  1616,  -300
 };
 
   /* YYDEFACTSTATE-NUM -- Default reduction number in state STATE-NUM.
@@ -993,64 +994,64 @@ static const yytype_int16 yypact[] =
 static const yytype_uint8 yydefact[] =
 {
        0,     0,    56,    61,     0,    57,     0,     0,     0,     0,
-       0,    59,    58,   139,   145,    72,    73,   111,   112,     0,
-     128,    51,   141,     0,     0,     0,     0,     0,     0,     0,
-       0,   116,     0,     0,     0,     0,     0,     0,     0,   114,
-     149,     0,     0,     0,     0,     0,     2,    74,    23,     6,
-      24,     0,    66,    21,   106,    67,    22,   108,   109,     5,
-      52,    20,    64,    65,    60,    62,    60,     0,     0,   160,
-     119,     0,    69,   105,     0,     0,   162,   158,     0,    52,
-     110,     0,     0,   129,     0,   130,   131,   133,     0,    38,
-       0,   107,     0,    52,     0,     0,     0,     0,     0,     0,
-     144,   121,   136,   138,     0,    88,     0,     0,     0,     0,
-       0,     0,     0,     0,    93,    94,     0,    59,    58,   166,
-     169,     0,   167,   168,   171,     1,     0,    48,     0,     0,
+       0,    59,    58,   142,   148,    75,    76,   114,   115,     0,
+     131,    51,   144,     0,     0,     0,     0,     0,     0,     0,
+       0,   119,     0,     0,     0,     0,     0,     0,     0,   117,
+     152,     0,     0,     0,     0,     0,     2,    77,    23,     6,
+      24,     0,    66,    21,   109,    67,    22,   111,   112,     5,
+      52,    20,    64,    65,    60,    62,    60,     0,     0,   163,
+     122,     0,    69,   108,     0,     0,   165,   161,     0,    52,
+     113,     0,     0,   132,     0,   133,   134,   136,     0,    38,
+       0,   110,     0,    52,     0,     0,     0,     0,     0,     0,
+     147,   124,   139,   141,     0,    91,     0,     0,     0,     0,
+       0,     0,     0,     0,    96,    97,     0,    59,    58,   169,
+     172,     0,   170,   171,   174,     1,     0,    48,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   151,     0,     0,   160,     0,
-       0,     0,    71,     0,     0,   140,   151,   122,   113,   135,
-       0,   132,   142,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   137,   126,
-     117,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    42,    42,   124,   115,   150,    63,     0,     0,   164,
-       0,     0,     3,     0,    84,    85,    82,    83,    86,    87,
-      79,    90,    91,    92,    81,    80,    89,    75,    76,    77,
-      78,   152,     0,   118,   161,    68,    70,   163,     0,     0,
-     134,    52,     0,     7,     8,    10,    11,     0,     0,    48,
-      15,    13,     0,     0,     0,    14,    12,    19,    39,   120,
-       0,    97,     0,    99,     0,   101,     0,   103,     0,    95,
-      96,     0,    53,     0,   174,   173,   170,     0,     0,   172,
-      53,   157,     0,   157,   123,   151,     0,    34,    26,    53,
-      16,    17,     0,   127,     0,     0,     0,     0,    52,     0,
-     125,     0,    53,   153,    53,     0,     9,    52,    50,    50,
-       0,     0,    98,   100,   102,   104,    41,    54,    55,     0,
-      45,     0,     0,   157,    35,    27,    31,     0,     0,    40,
-      52,   154,    53,    48,     0,     0,    25,    18,    53,     0,
-      46,     0,   155,   147,     0,    36,     0,     0,     0,    48,
-      43,     0,    53,    28,     0,     0,     0,   156,     0,    48,
-      32,    44,    53,    37,    53,    48,     0,     0,    53,    47,
-      29,     0,    33
+       0,     0,     0,     0,     0,   154,     0,     0,   163,     0,
+       0,     0,    74,    60,     0,     0,   143,   154,   125,   116,
+     138,     0,   135,   145,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   140,
+     129,   120,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    42,    42,   127,   118,   153,    63,     0,     0,
+     167,     0,     0,     3,     0,    87,    88,    85,    86,    89,
+      90,    82,    93,    94,    95,    84,    83,    92,    78,    79,
+      80,    81,   155,     0,   121,   164,    68,    70,    71,    73,
+     166,     0,     0,   137,    52,     0,     7,     8,    10,    11,
+       0,     0,    48,    15,    13,     0,     0,     0,    14,    12,
+      19,    39,   123,     0,   100,     0,   102,     0,   104,     0,
+     106,     0,    98,    99,     0,    53,     0,   177,   176,   173,
+       0,     0,   175,    53,   160,     0,     0,   160,   126,   154,
+       0,    34,    26,    53,    16,    17,     0,   130,     0,     0,
+       0,     0,    52,     0,   128,     0,    53,   156,     0,    53,
+       0,     9,    52,    50,    50,     0,     0,   101,   103,   105,
+     107,    41,    54,    55,     0,    45,     0,    72,     0,   160,
+      35,    27,    31,     0,     0,    40,    52,   157,    53,    48,
+       0,     0,    25,    18,    53,     0,    46,     0,   158,   150,
+       0,    36,     0,     0,     0,    48,    43,     0,    53,    28,
+       0,     0,     0,   159,     0,    48,    32,    44,    53,    37,
+      53,    48,     0,     0,    53,    47,    29,     0,    33
 };
 
   /* YYPGOTONTERM-NUM.  */
 static const yytype_int16 yypgoto[] =
 {
-    -293,    85,  -293,  -293,   -47,    15,  -293,  -293,  -293,  -293,
-    -293,  -293,  -293,  -293,  -293,    23,  -293,  -293,  -293,  -151,
-    -292,   -83,  -293,   -76,  1690,     3,    -6,  -293,    54,  -293,
-    -293,  -293,  -293,  -293,  -293,  -293,  -293,    -8,  -293,  -293,
-    -293,  -293,  -293,  -293,  -293,  -293,  -154,  -293,  -267,  -293,
-      13,  -293,  -293,  -293,  -293,  -293,    16
+    -300,    98,  -300,  -300,   -41,    15,  -300,  -300,  -300,  -300,
+    -300,  -300,  -300,  -300,  -300,    39,  -300,  -300,  -300,  -156,
+    -299,   -62,  -300,   -77,   -87,     3,    -6,  -300,  -300,    78,
+    -300,  -300,  -300,  -300,  -300,  -300,  -300,  -300,   -27,  -300,
+    -300,  -300,  -300,  -300,  -300,  -300,  -300,  -140,  -300,  -272,
+    -300,    13,   -32,  -300,  -300,  -300,  -300,    43
 };
 
   /* YYDEFGOTONTERM-NUM.  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    45,    46,    47,    48,   308,   298,   324,   349,   299,
-     325,   355,   297,   323,   342,   261,    50,   320,   330,   203,
-     310,   315,    51,   145,   289,    52,    53,    54,    55,    56,
-      81,   112,   104,   158,   194,   180,    57,    87,    58,    78,
-      59,    88,   231,    79,    60,   113,   222,   333,   292,    61,
-     153,    77,    62,   121,   122,   123,   124
+      -1,    45,    46,    47,    48,   313,   303,   330,   355,   304,
+     331,   361,   302,   329,   348,   264,    50,   326,   336,   204,
+     315,   321,    51,   145,   293,    52,    53,   276,    54,    55,
+      56,    81,   112,   104,   159,   195,   181,    57,    87,    58,
+      78,    59,    88,   234,    79,    60,   113,   223,   339,   296,
+      61,   154,    77,    62,   121,   122,   123,   124
 };
 
   /* YYTABLEYYPACT[STATE-NUM] -- What to do in state STATE-NUM.  If
@@ -1058,101 +1059,110 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      69,    69,   228,   156,    76,    63,   294,    65,   317,   271,
-      74,    73,   272,    86,    80,    49,   134,   168,    91,    70,
-      72,   237,   103,   101,   102,    89,   105,   106,   107,   108,
-     109,   110,   111,   134,   169,   114,   115,   116,   120,   125,
-     143,   144,   238,   173,   170,   127,   322,   223,   150,     8,
-     242,   233,    99,   174,     1,   141,   142,   143,   144,   100,
-     243,   147,   148,   273,   359,   148,   272,     2,   126,   148,
-       3,     4,    69,   267,     5,   268,   159,   152,   161,    64,
-      11,   149,    12,   134,   151,   146,   135,   313,   279,   150,
-     272,   155,    92,    93,   178,   225,   150,   154,   171,   172,
-      33,    34,    35,    36,   140,   141,   142,   143,   144,   226,
-     150,   328,   329,   157,   160,   162,   163,   167,   175,   176,
-     179,   295,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   193,
-      69,    49,   195,   197,   224,   198,   199,   200,   227,   201,
-      43,   221,   244,    44,   230,   275,   229,   250,   263,   235,
-     236,   270,   239,   240,   241,   274,   232,   245,   246,   247,
-     248,   249,   335,   276,   282,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   283,   290,   293,   346,   318,
-      94,    95,    96,   319,   266,   326,   332,   336,   354,    97,
-     264,   265,   337,   340,   358,   344,    98,   347,   351,   341,
-     352,   202,   306,   309,   288,   262,   316,   269,   234,     0,
-       0,   314,     0,     0,     0,     0,     1,     0,     0,     0,
-       0,   277,   278,     0,     0,     0,   280,   281,     0,     2,
-       0,     0,     3,     4,   331,     0,     5,     0,     7,     8,
-       9,    66,    11,     0,    12,     0,     0,     0,    15,    16,
-       0,     0,   345,     0,     0,     0,     0,     0,     0,     0,
-     296,    82,    83,    84,    85,    67,     0,    26,   302,   303,
-     304,   305,     0,     0,     0,   301,     0,     0,     0,     0,
-       0,     0,     0,    32,     0,     0,     0,     0,     0,     0,
-      33,    34,    35,    36,    37,     0,     0,     0,     0,     0,
-    -159,     1,   327,     0,     0,     0,    41,    42,     0,     0,
-       0,     0,    43,   339,     2,    44,     0,     3,     4,     0,
-     343,     5,  -159,     7,     8,     9,    66,    11,   350,    12,
-    -159,  -159,     0,    15,    16,  -159,  -159,  -159,  -159,  -159,
-    -159,  -159,  -159,     0,  -159,     0,  -159,  -159,  -159,     0,
-      67,  -159,    26,  -159,  -159,  -159,  -159,     0,     0,  -159,
-    -159,  -159,  -159,  -159,  -159,  -159,  -159,  -159,    32,  -159,
-    -159,  -159,  -159,  -159,  -159,    33,    34,    35,    36,    37,
-    -159,  -159,  -159,  -159,     0,  -159,  -159,  -159,  -159,  -159,
-    -159,    41,    42,  -159,  -159,     1,  -159,    71,  -159,  -159,
-      44,  -159,   -30,     0,     0,     0,     0,     0,     2,     0,
-       0,     3,     4,     0,     0,     5,     0,     7,     8,     9,
-      66,   117,     0,   118,     0,     0,     0,    15,    16,   128,
-     129,   130,   131,   132,   133,     0,   134,     0,     0,   135,
-     136,   137,     0,     0,    67,     0,    26,     0,     0,     0,
-       0,     0,     0,     0,     0,   138,   139,   140,   141,   142,
-     143,   144,    32,     0,     0,     0,     0,     0,     0,    33,
-      34,    35,    36,    37,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   -60,     1,    41,    42,     0,     0,     0,
-       0,    43,     0,     0,    44,  -165,   119,     2,     0,     0,
-       3,     4,     0,     0,     5,   -60,     7,     8,     9,    66,
-      11,     0,    12,   -60,   -60,     0,    15,    16,     0,   -60,
-     -60,   -60,   -60,   -60,   -60,   -60,     0,     0,     0,     0,
-     -60,     0,     0,    67,   -60,    26,     0,     0,   -60,     0,
-       0,     0,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,
-     -60,    32,   -60,     0,     0,   -60,   -60,   -60,    33,    34,
-      35,    36,    37,     0,     0,   -60,   -60,     0,   -60,   -60,
-     -60,   -60,   -60,   -60,    41,    42,   -60,   -60,     0,   -60,
-      75,  -159,     1,    44,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     2,     0,     0,     3,     4,
-       0,     0,     5,  -159,     7,     8,     9,    66,    11,     0,
-      12,  -159,  -159,     0,    15,    16,     0,  -159,  -159,  -159,
-    -159,  -159,  -159,  -159,     0,     0,     0,     0,  -159,     0,
-       0,    67,  -159,    26,     0,     0,  -159,     0,     0,     0,
-    -159,  -159,  -159,     0,     0,     0,     0,     0,     0,    32,
-       0,     0,     0,     0,     0,     0,    33,    34,    35,    36,
-      37,     0,     0,  -159,  -159,     0,  -159,  -159,  -159,  -159,
-       1,     0,    41,    42,     0,     0,     0,  -159,    68,     0,
-    -159,    44,     0,     2,     0,     0,     3,     4,     0,     0,
-       5,  -159,     7,     8,     9,    66,    11,     0,    12,  -159,
-    -159,     0,    15,    16,     0,  -159,  -159,  -159,  -159,  -159,
-    -159,  -159,     0,     0,     0,     0,  -159,     0,     0,    67,
-    -159,    26,     0,     0,  -159,     0,     0,     0,  -159,  -159,
-    -159,     0,     0,     0,     0,     0,     0,    32,     0,     0,
-       0,     0,     0,     0,    33,    34,    35,    36,    37,     0,
-       0,  -159,  -159,     0,  -159,  -159,  -159,    -4,     1,     0,
-      41,    42,     0,     0,     0,  -159,    43,     0,  -159,    44,
-       0,     2,     0,     0,     3,     4,     0,     0,     5,     6,
-       7,     8,     9,    10,    11,     0,    12,     0,    13,    14,
-      15,    16,     0,     0,     0,    17,    18,    19,    20,    21,
-       0,     0,    22,     0,    23,     0,     0,    24,    25,    26,
-       0,     0,    27,     0,     0,    28,    29,    30,    31,     0,
+      69,    69,   157,   103,    76,   299,   323,    65,   146,   227,
+     228,    73,   170,    86,    63,    49,   169,   231,    91,    70,
+      72,   240,   171,   101,   102,   134,   105,   106,   107,   108,
+     109,   110,   111,   134,   174,   114,   115,   116,   120,    92,
+      93,     8,   241,   236,   175,   127,    74,   328,   274,   143,
+     144,   275,   224,   150,     1,   141,   142,   143,   144,   162,
+      80,   147,   148,   365,   270,   148,   271,     2,   245,   148,
+       3,     4,    69,    89,     5,   179,   160,   152,   246,    64,
+      11,   149,    12,    99,   151,   134,   283,   277,   135,   100,
+     275,   156,    33,    34,    35,    36,   125,   319,   172,   173,
+     275,   126,    94,    95,    96,   146,   140,   141,   142,   143,
+     144,    97,   334,   335,   158,   161,   226,   150,    98,   229,
+     150,   163,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   300,
+      69,    49,   317,   155,   225,   150,   155,   164,   168,   230,
+      43,   176,   177,    44,   180,   233,   194,   279,   196,   200,
+     238,   239,   198,   242,   243,   244,   199,   235,   248,   249,
+     250,   251,   252,   341,   201,   222,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   295,   247,   202,   352,
+     232,   253,   266,   273,   278,   269,   305,   280,   286,   360,
+     287,   267,   268,   294,   297,   364,   324,   325,   338,   316,
+     332,   342,   318,   347,   343,   311,   314,   350,   192,   346,
+     353,   357,   358,   292,   203,   320,   128,   129,   130,   131,
+     132,   133,   265,   134,   281,   282,   135,   136,   137,   284,
+     285,   340,   322,   237,   298,   272,     0,   344,     0,   337,
+       0,     0,   138,   139,   140,   141,   142,   143,   144,     0,
+     193,   354,     0,     0,     0,     0,   -30,   351,     0,     0,
+      76,   362,     0,   363,   301,     0,     0,   367,     0,     0,
+       0,     0,   307,   308,   309,   310,     0,     0,     0,   306,
+       0,     0,     0,   128,   129,   130,   131,   132,   133,     0,
+     134,     0,     0,   135,   136,   137,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  -162,     1,   333,   138,
+     139,   140,   141,   142,   143,   144,     0,     0,     0,   345,
+       2,     0,     0,     3,     4,     0,   349,     5,  -162,     7,
+       8,     9,    66,    11,   356,    12,  -162,  -162,     0,    15,
+      16,  -162,  -162,  -162,  -162,  -162,  -162,  -162,  -162,     0,
+    -162,     0,  -162,  -162,  -162,     0,    67,  -162,    26,  -162,
+    -162,  -162,  -162,     0,     0,  -162,  -162,  -162,  -162,  -162,
+    -162,  -162,  -162,  -162,    32,  -162,  -162,  -162,  -162,  -162,
+    -162,    33,    34,    35,    36,    37,  -162,  -162,  -162,  -162,
+       0,  -162,  -162,  -162,  -162,  -162,  -162,    41,    42,  -162,
+    -162,     1,  -162,    71,  -162,  -162,    44,  -162,     0,     0,
+       0,     0,     0,     0,     2,     0,     0,     3,     4,     0,
+       0,     5,     0,     7,     8,     9,    66,   117,     0,   118,
+       0,     0,     0,    15,    16,     0,   165,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      67,     0,    26,     0,   128,   129,   130,   131,   132,   133,
+       0,   134,   166,   167,   135,   136,   137,     0,    32,     0,
+       0,     0,     0,     0,     0,    33,    34,    35,    36,    37,
+     138,   139,   140,   141,   142,   143,   144,     0,     0,   -60,
+       1,    41,    42,     0,     0,     0,     0,    43,     0,     0,
+      44,  -168,   119,     2,     0,     0,     3,     4,     0,     0,
+       5,   -60,     7,     8,     9,    66,    11,     0,    12,   -60,
+     -60,     0,    15,    16,     0,   -60,   -60,   -60,   -60,   -60,
+     -60,   -60,     0,     0,     0,     0,   -60,     0,     0,    67,
+     -60,    26,     0,     0,   -60,     0,     0,     0,   -60,   -60,
+     -60,   -60,   -60,   -60,   -60,   -60,   -60,    32,   -60,     0,
+       0,   -60,   -60,   -60,    33,    34,    35,    36,    37,     0,
+       0,   -60,   -60,     0,   -60,   -60,   -60,   -60,   -60,   -60,
+      41,    42,   -60,   -60,     0,   -60,    75,  -162,     1,    44,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     2,     0,     0,     3,     4,     0,     0,     5,  -162,
+       7,     8,     9,    66,    11,     0,    12,  -162,  -162,     0,
+      15,    16,     0,  -162,  -162,  -162,  -162,  -162,  -162,  -162,
+       0,     0,     0,     0,  -162,     0,     0,    67,  -162,    26,
+       0,     0,  -162,     0,     0,     0,  -162,  -162,  -162,     0,
        0,     0,     0,     0,     0,    32,     0,     0,     0,     0,
-       0,     0,    33,    34,    35,    36,    37,     0,     0,    38,
-      39,    40,  -148,     1,     0,     0,     0,     0,    41,    42,
-       0,     0,     0,    -4,    43,     0,     2,    44,     0,     3,
+       0,     0,    33,    34,    35,    36,    37,     0,     0,  -162,
+    -162,     0,  -162,  -162,  -162,  -162,     1,     0,    41,    42,
+       0,     0,     0,  -162,    68,     0,  -162,    44,     0,     2,
+       0,     0,     3,     4,     0,     0,     5,  -162,     7,     8,
+       9,    66,    11,     0,    12,  -162,  -162,     0,    15,    16,
+       0,  -162,  -162,  -162,  -162,  -162,  -162,  -162,     0,     0,
+       0,     0,  -162,     0,     0,    67,  -162,    26,     0,     0,
+    -162,     0,     0,     0,  -162,  -162,  -162,     0,     0,     0,
+       0,     0,     0,    32,     0,     0,     0,     0,     0,     0,
+      33,    34,    35,    36,    37,     0,     0,  -162,  -162,     0,
+    -162,  -162,  -162,    -4,     1,     0,    41,    42,     0,     0,
+       0,  -162,    43,     0,  -162,    44,     0,     2,     0,     0,
+       3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,     0,    12,     0,    13,    14,    15,    16,     0,     0,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,     0,
+      23,     0,     0,    24,    25,    26,     0,     0,    27,     0,
+       0,    28,    29,    30,    31,     0,     0,     0,     0,     0,
+       0,    32,     0,     0,     0,     0,     0,     0,    33,    34,
+      35,    36,    37,     0,     0,    38,    39,    40,  -151,     1,
+       0,     0,     0,     0,    41,    42,     0,     0,     0,    -4,
+      43,     0,     2,    44,     0,     3,     4,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,     0,    12,   327,    13,
+       0,    15,    16,     0,     0,     0,    17,    18,    19,    20,
+      21,     0,     0,     0,     0,    23,     0,     0,    24,    25,
+      26,     0,     0,    27,     0,     0,     0,    29,    30,    31,
+       0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
+       0,     0,     0,    33,    34,    35,    36,    37,     0,     0,
+      38,    39,  -149,     1,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,   312,    43,     2,     0,    44,     3,
        4,     0,     0,     5,     6,     7,     8,     9,    10,    11,
-       0,    12,   321,    13,     0,    15,    16,     0,     0,     0,
+       0,    12,     0,    13,     0,    15,    16,     0,     0,     0,
       17,    18,    19,    20,    21,     0,     0,     0,     0,    23,
        0,     0,    24,    25,    26,     0,     0,    27,     0,     0,
        0,    29,    30,    31,     0,     0,     0,     0,     0,     0,
       32,     0,     0,     0,     0,     0,     0,    33,    34,    35,
       36,    37,     0,     0,    38,    39,  -146,     1,     0,     0,
-       0,     0,     0,    41,    42,     0,     0,     0,   307,    43,
+       0,     0,     0,    41,    42,     0,     0,     0,   312,    43,
        2,     0,    44,     3,     4,     0,     0,     5,     6,     7,
        8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
       16,     0,     0,     0,    17,    18,    19,    20,    21,     0,
@@ -1160,58 +1170,58 @@ static const yytype_int16 yytable[] =
        0,    27,     0,     0,     0,    29,    30,    31,     0,     0,
        0,     0,     0,     0,    32,     0,     0,     0,     0,     0,
        0,    33,    34,    35,    36,    37,     0,     0,    38,    39,
-    -143,     1,     0,     0,     0,     0,     0,    41,    42,     0,
-       0,     0,   307,    43,     2,     0,    44,     3,     4,     0,
+       0,     1,     0,     0,     0,     0,     0,    41,    42,     0,
+       0,     0,   312,    43,     2,     0,    44,     3,     4,     0,
        0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
-       0,    13,     0,    15,    16,     0,     0,     0,    17,    18,
+       0,    13,     0,    15,    16,     0,   -49,   -49,    17,    18,
       19,    20,    21,     0,     0,     0,     0,    23,     0,     0,
       24,    25,    26,     0,     0,    27,     0,     0,     0,    29,
       30,    31,     0,     0,     0,     0,     0,     0,    32,     0,
        0,     0,     0,     0,     0,    33,    34,    35,    36,    37,
-       0,     0,    38,    39,     0,     1,     0,     0,     0,     0,
-       0,    41,    42,     0,     0,     0,   307,    43,     2,     0,
-      44,     3,     4,     0,     0,     5,     6,     7,     8,     9,
-      10,    11,     0,    12,     0,    13,     0,    15,    16,     0,
-     -49,   -49,    17,    18,    19,    20,    21,     0,     0,     0,
-       0,    23,     0,     0,    24,    25,    26,     0,     0,    27,
-       0,     0,     0,    29,    30,    31,     0,     0,     0,     0,
-       0,     0,    32,     0,     0,     0,     0,     0,     0,    33,
-      34,    35,    36,    37,     0,     0,    38,    39,     0,   -49,
-       1,     0,     0,     0,     0,    41,    42,     0,     0,     0,
-     307,    43,     0,     2,    44,     0,     3,     4,     0,     0,
+       0,     0,    38,    39,     0,   -49,     1,     0,     0,     0,
+       0,    41,    42,     0,     0,     0,   312,    43,     0,     2,
+      44,     0,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,     0,    15,    16,
+       0,     0,     0,    17,    18,    19,    20,    21,     0,     0,
+       0,     0,    23,     0,     0,    24,    25,    26,     0,     0,
+      27,     0,     0,     0,    29,    30,    31,     0,     0,     0,
+       0,     0,     0,    32,     0,     0,     0,     0,     0,     0,
+      33,    34,    35,    36,    37,     0,     0,    38,    39,     0,
+       1,     0,   -52,     0,     0,     0,    41,    42,     0,     0,
+       0,   312,    43,     2,     0,    44,     3,     4,     0,     0,
        5,     6,     7,     8,     9,    10,    11,     0,    12,     0,
       13,     0,    15,    16,     0,     0,     0,    17,    18,    19,
       20,    21,     0,     0,     0,     0,    23,     0,     0,    24,
       25,    26,     0,     0,    27,     0,     0,     0,    29,    30,
       31,     0,     0,     0,     0,     0,     0,    32,     0,     0,
        0,     0,     0,     0,    33,    34,    35,    36,    37,     0,
-       0,    38,    39,     0,     1,     0,   -52,     0,     0,     0,
-      41,    42,     0,     0,     0,   307,    43,     2,     0,    44,
+       0,    38,    39,     0,     1,   -49,     0,     0,     0,     0,
+      41,    42,     0,     0,     0,   312,    43,     2,     0,    44,
        3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
       11,     0,    12,     0,    13,     0,    15,    16,     0,     0,
        0,    17,    18,    19,    20,    21,     0,     0,     0,     0,
       23,     0,     0,    24,    25,    26,     0,     0,    27,     0,
        0,     0,    29,    30,    31,     0,     0,     0,     0,     0,
        0,    32,     0,     0,     0,     0,     0,     0,    33,    34,
-      35,    36,    37,     0,     0,    38,    39,     0,     1,   -49,
-       0,     0,     0,     0,    41,    42,     0,     0,     0,   307,
-      43,     2,     0,    44,     3,     4,     0,     0,     5,     6,
-       7,     8,     9,    10,    11,     0,    12,     0,    13,     0,
-      15,    16,     0,     0,     0,    17,    18,    19,    20,    21,
-       0,     0,     0,     0,    23,     0,     0,    24,    25,    26,
-       0,     0,    27,     0,     0,     0,    29,    30,    31,     0,
-       0,     0,     0,     0,     0,    32,     0,     0,     0,     0,
-       0,     0,    33,    34,    35,    36,    37,     0,     0,    38,
-      39,     0,   -52,     1,     0,     0,     0,     0,    41,    42,
-       0,     0,     0,   307,    43,     0,     2,    44,     0,     3,
+      35,    36,    37,     0,     0,    38,    39,     0,   -52,     1,
+       0,     0,     0,     0,    41,    42,     0,     0,     0,   312,
+      43,     0,     2,    44,     0,     3,     4,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,     0,    12,     0,    13,
+       0,    15,    16,     0,     0,     0,    17,    18,    19,    20,
+      21,     0,     0,     0,     0,    23,     0,     0,    24,    25,
+      26,     0,     0,    27,     0,     0,     0,    29,    30,    31,
+       0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
+       0,     0,     0,    33,    34,    35,    36,    37,     0,     0,
+      38,    39,     0,     1,   359,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,   312,    43,     2,     0,    44,     3,
        4,     0,     0,     5,     6,     7,     8,     9,    10,    11,
        0,    12,     0,    13,     0,    15,    16,     0,     0,     0,
       17,    18,    19,    20,    21,     0,     0,     0,     0,    23,
        0,     0,    24,    25,    26,     0,     0,    27,     0,     0,
        0,    29,    30,    31,     0,     0,     0,     0,     0,     0,
       32,     0,     0,     0,     0,     0,     0,    33,    34,    35,
-      36,    37,     0,     0,    38,    39,     0,     1,   353,     0,
-       0,     0,     0,    41,    42,     0,     0,     0,   307,    43,
+      36,    37,     0,     0,    38,    39,     0,     1,   366,     0,
+       0,     0,     0,    41,    42,     0,     0,     0,   312,    43,
        2,     0,    44,     3,     4,     0,     0,     5,     6,     7,
        8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
       16,     0,     0,     0,    17,    18,    19,    20,    21,     0,
@@ -1219,193 +1229,197 @@ static const yytype_int16 yytable[] =
        0,    27,     0,     0,     0,    29,    30,    31,     0,     0,
        0,     0,     0,     0,    32,     0,     0,     0,     0,     0,
        0,    33,    34,    35,    36,    37,     0,     0,    38,    39,
-       0,     1,   360,     0,     0,     0,     0,    41,    42,     0,
-       0,     0,   307,    43,     2,     0,    44,     3,     4,     0,
+       0,     1,   368,     0,     0,     0,     0,    41,    42,     0,
+       0,     0,   312,    43,     2,     0,    44,     3,     4,     0,
        0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
        0,    13,     0,    15,    16,     0,     0,     0,    17,    18,
-      19,    20,    21,     0,     0,     0,     0,    23,     0,     0,
-      24,    25,    26,     0,     0,    27,     0,     0,     0,    29,
+      19,    20,     0,     0,     0,     0,     0,     0,     0,     0,
+      24,     0,    26,     0,     0,     0,     0,     0,     0,    29,
       30,    31,     0,     0,     0,     0,     0,     0,    32,     0,
        0,     0,     0,     0,     0,    33,    34,    35,    36,    37,
-       0,     0,    38,    39,     0,     1,   362,     0,     0,     0,
-       0,    41,    42,     0,     0,     0,   307,    43,     2,     0,
-      44,     3,     4,     0,     0,     5,     6,     7,     8,     9,
-      10,    11,     0,    12,     0,    13,     0,    15,    16,     0,
-       0,     0,    17,    18,    19,    20,     0,     0,     0,     0,
-       0,     0,     0,     0,    24,     0,    26,     0,     0,     0,
-       0,     0,     0,    29,    30,    31,     0,     0,     0,     0,
-       0,     0,    32,     0,     0,     0,     0,     0,     0,    33,
-      34,    35,    36,    37,     0,     0,     1,    39,     0,     0,
-       0,     0,     0,     0,     0,    41,    42,     0,     0,     2,
-       0,    43,     3,     4,    44,     0,     5,     0,     7,     8,
-       9,    66,    11,     0,    12,     0,     0,     0,    15,    16,
-       0,     0,     0,     1,     0,     0,     0,     0,     0,     0,
-       0,    82,     0,    84,     0,    67,     2,    26,     0,     3,
-       4,     0,     0,     5,     0,     7,     8,     9,    66,    11,
-       0,    12,     0,    32,     0,    15,    16,     0,     0,     0,
-      33,    34,    35,    36,    37,     0,     0,     0,     0,     0,
-       0,     0,    67,     0,    26,     0,    41,    42,     0,     0,
-       0,     0,    43,     0,     0,    44,     0,     0,     0,     0,
-      32,     0,     0,     0,     0,     0,     0,    33,    34,    35,
-      36,    37,     0,     0,     0,     0,     0,     0,     0,     0,
-       1,     0,     0,    41,    42,     0,     0,     0,     0,    43,
-    -159,  -159,    44,     2,     0,     0,     3,     4,     0,    90,
+       0,     0,     1,    39,     0,     0,     0,     0,     0,     0,
+       0,    41,    42,     0,     0,     2,     0,    43,     3,     4,
+      44,     0,     5,     0,     7,     8,     9,    66,    11,     0,
+      12,     0,     0,     0,    15,    16,     0,     0,     0,     1,
+       0,     0,     0,     0,     0,     0,     0,    82,    83,    84,
+      85,    67,     2,    26,     0,     3,     4,     0,     0,     5,
+       0,     7,     8,     9,    66,    11,     0,    12,     0,    32,
+       0,    15,    16,     0,     0,     0,    33,    34,    35,    36,
+      37,     0,     0,     0,    82,     0,    84,     0,    67,     0,
+      26,     0,    41,    42,     0,     0,     0,     0,    43,     0,
+       0,    44,     0,     0,     0,     0,    32,     0,     0,     0,
+       0,     0,     0,    33,    34,    35,    36,    37,     0,     0,
+       1,     0,     0,     0,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     2,     0,    43,     3,     4,    44,     0,
        5,     0,     7,     8,     9,    66,    11,     0,    12,     0,
-       1,     0,    15,    16,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     2,     0,     0,     3,     4,     0,    67,
-       5,    26,     7,     8,     9,    66,    11,     0,    12,     0,
-     291,     0,    15,    16,     0,     0,     0,    32,     0,   300,
-       0,     0,     0,     0,    33,    34,    35,    36,    37,    67,
-       0,    26,   311,     0,   312,     0,     0,     0,     0,     0,
-      41,    42,     0,     0,     0,     0,    43,    32,     0,    44,
-       0,     0,     0,     0,    33,    34,    35,    36,    37,     0,
-       0,     0,   334,     0,     0,     0,     0,     0,   338,     0,
-      41,    42,     0,     0,     0,     0,    43,     0,     0,    44,
-       0,   164,   348,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   356,     0,   357,     0,     0,     0,   361,   128,
-     129,   130,   131,   132,   133,     0,   134,   165,   166,   135,
-     136,   137,     0,     0,     0,     0,    82,     0,    84,     0,
-       0,     0,     0,     0,     0,   138,   139,   140,   141,   142,
-     143,   144,   128,   129,   130,   131,   132,   133,     0,   134,
-       0,     0,   135,   136,   137,     0,     0,     0,     0,     0,
-       0,   181,     0,     0,     0,     0,     0,   182,   138,   139,
-     140,   141,   142,   143,   144,   128,   129,   130,   131,   132,
-     133,     0,   134,     0,     0,   135,   136,   137,     0,     0,
-       0,     0,     0,     0,   183,     0,     0,     0,     0,     0,
-     184,   138,   139,   140,   141,   142,   143,   144,   128,   129,
-     130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
-     137,     0,     0,     0,     0,     0,     0,   185,     0,     0,
-       0,     0,     0,   186,   138,   139,   140,   141,   142,   143,
-     144,   128,   129,   130,   131,   132,   133,     0,   134,     0,
-       0,   135,   136,   137,     0,     0,     0,     0,     0,     0,
-     187,     0,     0,     0,     0,     0,   188,   138,   139,   140,
-     141,   142,   143,   144,   128,   129,   130,   131,   132,   133,
+       0,     0,    15,    16,     0,     0,     0,     1,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    67,
+       2,    26,     0,     3,     4,     0,     0,     5,     0,     7,
+       8,     9,   153,    11,     0,    12,     0,    32,     0,    15,
+      16,     0,     0,     0,    33,    34,    35,    36,    37,     0,
+       0,     0,     0,     0,     0,     0,    67,     0,    26,     0,
+      41,    42,     0,     0,     0,     0,    43,  -162,  -162,    44,
+       0,     0,     0,     0,    32,     0,     0,     0,     0,     0,
+       0,    33,    34,    35,    36,    37,     0,     0,     0,     0,
+       0,     0,     0,     0,     1,     0,     0,    41,    42,     0,
+       0,     0,     0,    43,  -162,  -162,    44,     2,     0,     0,
+       3,     4,     0,    90,     5,     0,     7,     8,     9,    66,
+      11,     0,    12,     0,     1,     0,    15,    16,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     2,     0,     0,
+       3,     4,     0,    67,     5,    26,     7,     8,     9,    66,
+      11,     0,    12,     0,     0,     0,    15,    16,     0,     0,
+       0,    32,     0,     0,     0,     0,     0,     0,    33,    34,
+      35,    36,    37,    67,     0,    26,     0,     0,     0,     0,
+       0,     0,     0,     0,    41,    42,     0,     0,     0,     0,
+      43,    32,     0,    44,     0,     0,     0,     0,    33,    34,
+      35,    36,    37,     0,     0,     0,     0,     0,    82,     0,
+      84,     0,     0,     0,    41,    42,     0,     0,     0,     0,
+      43,     0,     0,    44,   128,   129,   130,   131,   132,   133,
        0,   134,     0,     0,   135,   136,   137,     0,     0,     0,
-       0,     0,     0,   284,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   182,     0,     0,     0,     0,     0,   183,
      138,   139,   140,   141,   142,   143,   144,   128,   129,   130,
      131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
-       0,     0,     0,     0,     0,     0,   285,     0,     0,     0,
-       0,     0,     0,   138,   139,   140,   141,   142,   143,   144,
+       0,     0,     0,     0,     0,     0,   184,     0,     0,     0,
+       0,     0,   185,   138,   139,   140,   141,   142,   143,   144,
      128,   129,   130,   131,   132,   133,     0,   134,     0,     0,
-     135,   136,   137,     0,     0,     0,     0,     0,     0,   286,
-       0,     0,     0,     0,     0,     0,   138,   139,   140,   141,
+     135,   136,   137,     0,     0,     0,     0,     0,     0,   186,
+       0,     0,     0,     0,     0,   187,   138,   139,   140,   141,
      142,   143,   144,   128,   129,   130,   131,   132,   133,     0,
      134,     0,     0,   135,   136,   137,     0,     0,     0,     0,
-       0,     0,   287,     0,     0,     0,     0,     0,     0,   138,
+       0,     0,   188,     0,     0,     0,     0,     0,   189,   138,
      139,   140,   141,   142,   143,   144,   128,   129,   130,   131,
      132,   133,     0,   134,     0,     0,   135,   136,   137,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   191,   138,   139,   140,   141,   142,   143,   144,   128,
+       0,     0,     0,     0,     0,   288,     0,     0,     0,     0,
+       0,     0,   138,   139,   140,   141,   142,   143,   144,   128,
      129,   130,   131,   132,   133,     0,   134,     0,     0,   135,
-     136,   137,     0,     0,     0,     0,     0,     0,     0,     0,
+     136,   137,     0,     0,     0,     0,     0,     0,   289,     0,
        0,     0,     0,     0,     0,   138,   139,   140,   141,   142,
-     143,   144,   177,   192,     0,     0,     0,     0,   128,   129,
-     130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
-     137,   128,   129,   130,   131,   132,   133,     0,   134,     0,
-       0,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,     0,     0,     0,     0,     0,     0,   138,   139,   140,
-     141,   142,   143,   144,     0,     0,     0,   196,   128,   129,
+     143,   144,   128,   129,   130,   131,   132,   133,     0,   134,
+       0,     0,   135,   136,   137,     0,     0,     0,     0,     0,
+       0,   290,     0,     0,     0,     0,     0,     0,   138,   139,
+     140,   141,   142,   143,   144,   128,   129,   130,   131,   132,
+     133,     0,   134,     0,     0,   135,   136,   137,     0,     0,
+       0,     0,     0,     0,   291,     0,     0,     0,     0,     0,
+       0,   138,   139,   140,   141,   142,   143,   144,   128,   129,
      130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
-     137,     0,     0,     0,     0,     0,   189,   190,     0,     0,
+     137,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,   138,   139,   140,   141,   142,   143,
-     144,   128,   129,   130,   131,   132,   133,     0,   134,     0,
-       0,   135,   136,   137,   128,   129,   130,   131,     0,     0,
-       0,   134,     0,     0,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,     0,     0,     0,     0,     0,     0,
-     138,   139,   140,   141,   142,   143,   144
+     144,   178,     0,     0,     0,     0,     0,   128,   129,   130,
+     131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
+     128,   129,   130,   131,   132,   133,     0,   134,     0,     0,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+       0,     0,     0,     0,     0,     0,   138,   139,   140,   141,
+     142,   143,   144,     0,     0,     0,   197,   128,   129,   130,
+     131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
+       0,     0,     0,     0,     0,   190,   191,     0,     0,     0,
+       0,     0,     0,   138,   139,   140,   141,   142,   143,   144,
+     128,   129,   130,   131,   132,   133,     0,   134,     0,     0,
+     135,   136,   137,   128,   129,   130,   131,     0,     0,     0,
+     134,     0,     0,   135,   136,   137,   138,   139,   140,   141,
+     142,   143,   144,     0,     0,     0,     0,     0,     0,   138,
+     139,   140,   141,   142,   143,   144
 };
 
 static const yytype_int16 yycheck[] =
 {
-       6,     7,   156,    79,    10,    96,   273,     4,   300,    96,
-      48,     8,    99,    19,    51,     0,    69,    93,    24,     6,
-       7,    43,    30,    29,    30,    51,    32,    33,    34,    35,
-      36,    37,    38,    69,    54,    41,    42,    43,    44,     0,
-      93,    94,    64,    54,    64,    51,   313,    98,    99,    24,
-      54,    26,    26,    64,     1,    91,    92,    93,    94,    26,
-      64,    67,    68,    96,   356,    71,    99,    14,    96,    75,
-      17,    18,    78,    27,    21,    29,    82,    74,    86,    26,
-      27,    68,    29,    69,    71,    97,    72,    96,   239,    99,
-      99,    78,    56,    57,   102,    98,    99,    99,    95,    96,
-      75,    76,    77,    78,    90,    91,    92,    93,    94,    98,
-      99,    36,    37,    26,    46,    26,    26,    26,    54,    53,
-      26,   275,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,    26,
-     146,   126,    26,   102,   150,   102,   101,    99,   154,    99,
-      97,    26,    48,   100,   160,   231,    99,    99,    99,   165,
-     166,    53,   168,   169,   170,    26,   163,   173,   174,   175,
-     176,   177,   323,    44,    26,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,    26,    26,    26,   339,    54,
-      17,    18,    19,    87,   200,    86,    26,    54,   349,    26,
-     197,   198,    35,    85,   355,    54,    33,    26,    85,    99,
-      53,   126,   288,   289,   261,   192,   299,   201,   164,    -1,
-      -1,   297,    -1,    -1,    -1,    -1,     1,    -1,    -1,    -1,
-      -1,   237,   238,    -1,    -1,    -1,   242,   243,    -1,    14,
-      -1,    -1,    17,    18,   320,    -1,    21,    -1,    23,    24,
-      25,    26,    27,    -1,    29,    -1,    -1,    -1,    33,    34,
-      -1,    -1,   338,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     276,    46,    47,    48,    49,    50,    -1,    52,   284,   285,
-     286,   287,    -1,    -1,    -1,   282,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,
-      75,    76,    77,    78,    79,    -1,    -1,    -1,    -1,    -1,
-       0,     1,   318,    -1,    -1,    -1,    91,    92,    -1,    -1,
-      -1,    -1,    97,   329,    14,   100,    -1,    17,    18,    -1,
-     336,    21,    22,    23,    24,    25,    26,    27,   344,    29,
-      30,    31,    -1,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    -1,    44,    -1,    46,    47,    48,    -1,
-      50,    51,    52,    53,    54,    55,    56,    -1,    -1,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    -1,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,     1,    96,    97,    98,    99,
-     100,   101,    35,    -1,    -1,    -1,    -1,    -1,    14,    -1,
-      -1,    17,    18,    -1,    -1,    21,    -1,    23,    24,    25,
-      26,    27,    -1,    29,    -1,    -1,    -1,    33,    34,    62,
-      63,    64,    65,    66,    67,    -1,    69,    -1,    -1,    72,
-      73,    74,    -1,    -1,    50,    -1,    52,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    90,    91,    92,
-      93,    94,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,
-      76,    77,    78,    79,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     0,     1,    91,    92,    -1,    -1,    -1,
-      -1,    97,    -1,    -1,   100,   101,   102,    14,    -1,    -1,
-      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    -1,    29,    30,    31,    -1,    33,    34,    -1,    36,
-      37,    38,    39,    40,    41,    42,    -1,    -1,    -1,    -1,
-      47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,    -1,
-      -1,    -1,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    -1,    -1,    72,    73,    74,    75,    76,
-      77,    78,    79,    -1,    -1,    82,    83,    -1,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    -1,    96,
-      97,     0,     1,   100,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,    17,    18,
-      -1,    -1,    21,    22,    23,    24,    25,    26,    27,    -1,
-      29,    30,    31,    -1,    33,    34,    -1,    36,    37,    38,
-      39,    40,    41,    42,    -1,    -1,    -1,    -1,    47,    -1,
-      -1,    50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,
-      59,    60,    61,    -1,    -1,    -1,    -1,    -1,    -1,    68,
-      -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,    78,
-      79,    -1,    -1,    82,    83,    -1,    85,    86,    87,     0,
-       1,    -1,    91,    92,    -1,    -1,    -1,    96,    97,    -1,
-      99,   100,    -1,    14,    -1,    -1,    17,    18,    -1,    -1,
+       6,     7,    79,    30,    10,   277,   305,     4,    97,    98,
+      99,     8,    54,    19,    96,     0,    93,   157,    24,     6,
+       7,    43,    64,    29,    30,    69,    32,    33,    34,    35,
+      36,    37,    38,    69,    54,    41,    42,    43,    44,    56,
+      57,    24,    64,    26,    64,    51,    48,   319,    96,    93,
+      94,    99,    98,    99,     1,    91,    92,    93,    94,    86,
+      51,    67,    68,   362,    27,    71,    29,    14,    54,    75,
+      17,    18,    78,    51,    21,   102,    82,    74,    64,    26,
+      27,    68,    29,    26,    71,    69,   242,    96,    72,    26,
+      99,    78,    75,    76,    77,    78,     0,    96,    95,    96,
+      99,    96,    17,    18,    19,    97,    90,    91,    92,    93,
+      94,    26,    36,    37,    26,    46,    98,    99,    33,    98,
+      99,    26,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   279,
+     146,   126,    98,    99,   150,    99,    99,    26,    26,   155,
+      97,    54,    53,   100,    26,   161,    26,   234,    26,   101,
+     166,   167,   102,   169,   170,   171,   102,   164,   174,   175,
+     176,   177,   178,   329,    99,    26,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   273,    48,    99,   345,
+      99,    99,    99,    53,    26,   201,   283,    44,    26,   355,
+      26,   198,   199,    26,    26,   361,    54,    87,    26,   296,
+      86,    54,   299,    99,    35,   292,   293,    54,    54,    85,
+      26,    85,    53,   264,   126,   302,    62,    63,    64,    65,
+      66,    67,   193,    69,   240,   241,    72,    73,    74,   245,
+     246,   328,   304,   165,   276,   202,    -1,   334,    -1,   326,
+      -1,    -1,    88,    89,    90,    91,    92,    93,    94,    -1,
+      96,   348,    -1,    -1,    -1,    -1,    35,   344,    -1,    -1,
+     276,   358,    -1,   360,   280,    -1,    -1,   364,    -1,    -1,
+      -1,    -1,   288,   289,   290,   291,    -1,    -1,    -1,   286,
+      -1,    -1,    -1,    62,    63,    64,    65,    66,    67,    -1,
+      69,    -1,    -1,    72,    73,    74,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     0,     1,   324,    88,
+      89,    90,    91,    92,    93,    94,    -1,    -1,    -1,   335,
+      14,    -1,    -1,    17,    18,    -1,   342,    21,    22,    23,
+      24,    25,    26,    27,   350,    29,    30,    31,    -1,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    -1,
+      44,    -1,    46,    47,    48,    -1,    50,    51,    52,    53,
+      54,    55,    56,    -1,    -1,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      -1,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,     1,    96,    97,    98,    99,   100,   101,    -1,    -1,
+      -1,    -1,    -1,    -1,    14,    -1,    -1,    17,    18,    -1,
+      -1,    21,    -1,    23,    24,    25,    26,    27,    -1,    29,
+      -1,    -1,    -1,    33,    34,    -1,    44,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      50,    -1,    52,    -1,    62,    63,    64,    65,    66,    67,
+      -1,    69,    70,    71,    72,    73,    74,    -1,    68,    -1,
+      -1,    -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,
+      88,    89,    90,    91,    92,    93,    94,    -1,    -1,     0,
+       1,    91,    92,    -1,    -1,    -1,    -1,    97,    -1,    -1,
+     100,   101,   102,    14,    -1,    -1,    17,    18,    -1,    -1,
       21,    22,    23,    24,    25,    26,    27,    -1,    29,    30,
       31,    -1,    33,    34,    -1,    36,    37,    38,    39,    40,
       41,    42,    -1,    -1,    -1,    -1,    47,    -1,    -1,    50,
       51,    52,    -1,    -1,    55,    -1,    -1,    -1,    59,    60,
-      61,    -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,
-      -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,
-      -1,    82,    83,    -1,    85,    86,    87,     0,     1,    -1,
-      91,    92,    -1,    -1,    -1,    96,    97,    -1,    99,   100,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    -1,
+      -1,    72,    73,    74,    75,    76,    77,    78,    79,    -1,
+      -1,    82,    83,    -1,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    -1,    96,    97,     0,     1,   100,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    14,    -1,    -1,    17,    18,    -1,    -1,    21,    22,
-      23,    24,    25,    26,    27,    -1,    29,    -1,    31,    32,
-      33,    34,    -1,    -1,    -1,    38,    39,    40,    41,    42,
-      -1,    -1,    45,    -1,    47,    -1,    -1,    50,    51,    52,
-      -1,    -1,    55,    -1,    -1,    58,    59,    60,    61,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    30,    31,    -1,
+      33,    34,    -1,    36,    37,    38,    39,    40,    41,    42,
+      -1,    -1,    -1,    -1,    47,    -1,    -1,    50,    51,    52,
+      -1,    -1,    55,    -1,    -1,    -1,    59,    60,    61,    -1,
       -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,
       -1,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
-      83,    84,     0,     1,    -1,    -1,    -1,    -1,    91,    92,
-      -1,    -1,    -1,    96,    97,    -1,    14,   100,    -1,    17,
+      83,    -1,    85,    86,    87,     0,     1,    -1,    91,    92,
+      -1,    -1,    -1,    96,    97,    -1,    99,   100,    -1,    14,
+      -1,    -1,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    30,    31,    -1,    33,    34,
+      -1,    36,    37,    38,    39,    40,    41,    42,    -1,    -1,
+      -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,
+      55,    -1,    -1,    -1,    59,    60,    61,    -1,    -1,    -1,
+      -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,
+      75,    76,    77,    78,    79,    -1,    -1,    82,    83,    -1,
+      85,    86,    87,     0,     1,    -1,    91,    92,    -1,    -1,
+      -1,    96,    97,    -1,    99,   100,    -1,    14,    -1,    -1,
+      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
+      27,    -1,    29,    -1,    31,    32,    33,    34,    -1,    -1,
+      -1,    38,    39,    40,    41,    42,    -1,    -1,    45,    -1,
+      47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,    -1,
+      -1,    58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,
+      -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,
+      77,    78,    79,    -1,    -1,    82,    83,    84,     0,     1,
+      -1,    -1,    -1,    -1,    91,    92,    -1,    -1,    -1,    96,
+      97,    -1,    14,   100,    -1,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    30,    31,
+      -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    -1,    47,    -1,    -1,    50,    51,
+      52,    -1,    -1,    55,    -1,    -1,    -1,    59,    60,    61,
+      -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,    -1,
+      82,    83,     0,     1,    -1,    -1,    -1,    -1,    -1,    91,
+      92,    -1,    -1,    -1,    96,    97,    14,    -1,   100,    17,
       18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
-      -1,    29,    30,    31,    -1,    33,    34,    -1,    -1,    -1,
+      -1,    29,    -1,    31,    -1,    33,    34,    -1,    -1,    -1,
       38,    39,    40,    41,    42,    -1,    -1,    -1,    -1,    47,
       -1,    -1,    50,    51,    52,    -1,    -1,    55,    -1,    -1,
       -1,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -1419,32 +1433,32 @@ static const yytype_int16 yycheck[] =
       -1,    55,    -1,    -1,    -1,    59,    60,    61,    -1,    -1,
       -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,
       -1,    75,    76,    77,    78,    79,    -1,    -1,    82,    83,
-       0,     1,    -1,    -1,    -1,    -1,    -1,    91,    92,    -1,
+      -1,     1,    -1,    -1,    -1,    -1,    -1,    91,    92,    -1,
       -1,    -1,    96,    97,    14,    -1,   100,    17,    18,    -1,
       -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
-      -1,    31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,
+      -1,    31,    -1,    33,    34,    -1,    36,    37,    38,    39,
       40,    41,    42,    -1,    -1,    -1,    -1,    47,    -1,    -1,
       50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,    59,
       60,    61,    -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,
       -1,    -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,
-      -1,    -1,    82,    83,    -1,     1,    -1,    -1,    -1,    -1,
-      -1,    91,    92,    -1,    -1,    -1,    96,    97,    14,    -1,
-     100,    17,    18,    -1,    -1,    21,    22,    23,    24,    25,
-      26,    27,    -1,    29,    -1,    31,    -1,    33,    34,    -1,
-      36,    37,    38,    39,    40,    41,    42,    -1,    -1,    -1,
-      -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,
-      -1,    -1,    -1,    59,    60,    61,    -1,    -1,    -1,    -1,
-      -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,
-      76,    77,    78,    79,    -1,    -1,    82,    83,    -1,    85,
-       1,    -1,    -1,    -1,    -1,    91,    92,    -1,    -1,    -1,
-      96,    97,    -1,    14,   100,    -1,    17,    18,    -1,    -1,
+      -1,    -1,    82,    83,    -1,    85,     1,    -1,    -1,    -1,
+      -1,    91,    92,    -1,    -1,    -1,    96,    97,    -1,    14,
+     100,    -1,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    -1,    31,    -1,    33,    34,
+      -1,    -1,    -1,    38,    39,    40,    41,    42,    -1,    -1,
+      -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,
+      55,    -1,    -1,    -1,    59,    60,    61,    -1,    -1,    -1,
+      -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,
+      75,    76,    77,    78,    79,    -1,    -1,    82,    83,    -1,
+       1,    -1,    87,    -1,    -1,    -1,    91,    92,    -1,    -1,
+      -1,    96,    97,    14,    -1,   100,    17,    18,    -1,    -1,
       21,    22,    23,    24,    25,    26,    27,    -1,    29,    -1,
       31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,
       41,    42,    -1,    -1,    -1,    -1,    47,    -1,    -1,    50,
       51,    52,    -1,    -1,    55,    -1,    -1,    -1,    59,    60,
       61,    -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,
       -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,
-      -1,    82,    83,    -1,     1,    -1,    87,    -1,    -1,    -1,
+      -1,    82,    83,    -1,     1,    86,    -1,    -1,    -1,    -1,
       91,    92,    -1,    -1,    -1,    96,    97,    14,    -1,   100,
       17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
       27,    -1,    29,    -1,    31,    -1,    33,    34,    -1,    -1,
@@ -1452,17 +1466,17 @@ static const yytype_int16 yycheck[] =
       47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,    -1,
       -1,    -1,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,
       -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,
-      77,    78,    79,    -1,    -1,    82,    83,    -1,     1,    86,
+      77,    78,    79,    -1,    -1,    82,    83,    -1,    85,     1,
       -1,    -1,    -1,    -1,    91,    92,    -1,    -1,    -1,    96,
-      97,    14,    -1,   100,    17,    18,    -1,    -1,    21,    22,
-      23,    24,    25,    26,    27,    -1,    29,    -1,    31,    -1,
-      33,    34,    -1,    -1,    -1,    38,    39,    40,    41,    42,
-      -1,    -1,    -1,    -1,    47,    -1,    -1,    50,    51,    52,
-      -1,    -1,    55,    -1,    -1,    -1,    59,    60,    61,    -1,
-      -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,
-      -1,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
-      83,    -1,    85,     1,    -1,    -1,    -1,    -1,    91,    92,
-      -1,    -1,    -1,    96,    97,    -1,    14,   100,    -1,    17,
+      97,    -1,    14,   100,    -1,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    -1,    31,
+      -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    -1,    47,    -1,    -1,    50,    51,
+      52,    -1,    -1,    55,    -1,    -1,    -1,    59,    60,    61,
+      -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,    -1,
+      82,    83,    -1,     1,    86,    -1,    -1,    -1,    -1,    91,
+      92,    -1,    -1,    -1,    96,    97,    14,    -1,   100,    17,
       18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
       -1,    29,    -1,    31,    -1,    33,    34,    -1,    -1,    -1,
       38,    39,    40,    41,    42,    -1,    -1,    -1,    -1,    47,
@@ -1482,96 +1496,91 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    96,    97,    14,    -1,   100,    17,    18,    -1,
       -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
       -1,    31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,
-      40,    41,    42,    -1,    -1,    -1,    -1,    47,    -1,    -1,
-      50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,    59,
+      40,    41,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      50,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,    59,
       60,    61,    -1,    -1,    -1,    -1,    -1,    -1,    68,    -1,
       -1,    -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,
-      -1,    -1,    82,    83,    -1,     1,    86,    -1,    -1,    -1,
-      -1,    91,    92,    -1,    -1,    -1,    96,    97,    14,    -1,
-     100,    17,    18,    -1,    -1,    21,    22,    23,    24,    25,
-      26,    27,    -1,    29,    -1,    31,    -1,    33,    34,    -1,
-      -1,    -1,    38,    39,    40,    41,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    50,    -1,    52,    -1,    -1,    -1,
-      -1,    -1,    -1,    59,    60,    61,    -1,    -1,    -1,    -1,
-      -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,
-      76,    77,    78,    79,    -1,    -1,     1,    83,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    91,    92,    -1,    -1,    14,
-      -1,    97,    17,    18,   100,    -1,    21,    -1,    23,    24,
-      25,    26,    27,    -1,    29,    -1,    -1,    -1,    33,    34,
-      -1,    -1,    -1,     1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    46,    -1,    48,    -1,    50,    14,    52,    -1,    17,
-      18,    -1,    -1,    21,    -1,    23,    24,    25,    26,    27,
-      -1,    29,    -1,    68,    -1,    33,    34,    -1,    -1,    -1,
-      75,    76,    77,    78,    79,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    50,    -1,    52,    -1,    91,    92,    -1,    -1,
-      -1,    -1,    97,    -1,    -1,   100,    -1,    -1,    -1,    -1,
-      68,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,
-      78,    79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       1,    -1,    -1,    91,    92,    -1,    -1,    -1,    -1,    97,
-      98,    99,   100,    14,    -1,    -1,    17,    18,    -1,    20,
+      -1,    -1,     1,    83,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    91,    92,    -1,    -1,    14,    -1,    97,    17,    18,
+     100,    -1,    21,    -1,    23,    24,    25,    26,    27,    -1,
+      29,    -1,    -1,    -1,    33,    34,    -1,    -1,    -1,     1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    46,    47,    48,
+      49,    50,    14,    52,    -1,    17,    18,    -1,    -1,    21,
+      -1,    23,    24,    25,    26,    27,    -1,    29,    -1,    68,
+      -1,    33,    34,    -1,    -1,    -1,    75,    76,    77,    78,
+      79,    -1,    -1,    -1,    46,    -1,    48,    -1,    50,    -1,
+      52,    -1,    91,    92,    -1,    -1,    -1,    -1,    97,    -1,
+      -1,   100,    -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,    -1,
+       1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,
+      92,    -1,    -1,    14,    -1,    97,    17,    18,   100,    -1,
       21,    -1,    23,    24,    25,    26,    27,    -1,    29,    -1,
-       1,    -1,    33,    34,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    14,    -1,    -1,    17,    18,    -1,    50,
-      21,    52,    23,    24,    25,    26,    27,    -1,    29,    -1,
-     270,    -1,    33,    34,    -1,    -1,    -1,    68,    -1,   279,
-      -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,    50,
-      -1,    52,   292,    -1,   294,    -1,    -1,    -1,    -1,    -1,
-      91,    92,    -1,    -1,    -1,    -1,    97,    68,    -1,   100,
-      -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,
-      -1,    -1,   322,    -1,    -1,    -1,    -1,    -1,   328,    -1,
-      91,    92,    -1,    -1,    -1,    -1,    97,    -1,    -1,   100,
-      -1,    44,   342,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   352,    -1,   354,    -1,    -1,    -1,   358,    62,
-      63,    64,    65,    66,    67,    -1,    69,    70,    71,    72,
-      73,    74,    -1,    -1,    -1,    -1,    46,    -1,    48,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    90,    91,    92,
-      93,    94,    62,    63,    64,    65,    66,    67,    -1,    69,
-      -1,    -1,    72,    73,    74,    -1,    -1,    -1,    -1,    -1,
-      -1,    48,    -1,    -1,    -1,    -1,    -1,    54,    88,    89,
-      90,    91,    92,    93,    94,    62,    63,    64,    65,    66,
-      67,    -1,    69,    -1,    -1,    72,    73,    74,    -1,    -1,
-      -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
-      54,    88,    89,    90,    91,    92,    93,    94,    62,    63,
-      64,    65,    66,    67,    -1,    69,    -1,    -1,    72,    73,
-      74,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,
-      -1,    -1,    -1,    54,    88,    89,    90,    91,    92,    93,
-      94,    62,    63,    64,    65,    66,    67,    -1,    69,    -1,
-      -1,    72,    73,    74,    -1,    -1,    -1,    -1,    -1,    -1,
-      48,    -1,    -1,    -1,    -1,    -1,    54,    88,    89,    90,
-      91,    92,    93,    94,    62,    63,    64,    65,    66,    67,
+      -1,    -1,    33,    34,    -1,    -1,    -1,     1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,
+      14,    52,    -1,    17,    18,    -1,    -1,    21,    -1,    23,
+      24,    25,    26,    27,    -1,    29,    -1,    68,    -1,    33,
+      34,    -1,    -1,    -1,    75,    76,    77,    78,    79,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    -1,
+      91,    92,    -1,    -1,    -1,    -1,    97,    98,    99,   100,
+      -1,    -1,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,
+      -1,    75,    76,    77,    78,    79,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     1,    -1,    -1,    91,    92,    -1,
+      -1,    -1,    -1,    97,    98,    99,   100,    14,    -1,    -1,
+      17,    18,    -1,    20,    21,    -1,    23,    24,    25,    26,
+      27,    -1,    29,    -1,     1,    -1,    33,    34,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,
+      17,    18,    -1,    50,    21,    52,    23,    24,    25,    26,
+      27,    -1,    29,    -1,    -1,    -1,    33,    34,    -1,    -1,
+      -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,
+      77,    78,    79,    50,    -1,    52,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    91,    92,    -1,    -1,    -1,    -1,
+      97,    68,    -1,   100,    -1,    -1,    -1,    -1,    75,    76,
+      77,    78,    79,    -1,    -1,    -1,    -1,    -1,    46,    -1,
+      48,    -1,    -1,    -1,    91,    92,    -1,    -1,    -1,    -1,
+      97,    -1,    -1,   100,    62,    63,    64,    65,    66,    67,
       -1,    69,    -1,    -1,    72,    73,    74,    -1,    -1,    -1,
-      -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    54,
       88,    89,    90,    91,    92,    93,    94,    62,    63,    64,
       65,    66,    67,    -1,    69,    -1,    -1,    72,    73,    74,
       -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,
-      -1,    -1,    -1,    88,    89,    90,    91,    92,    93,    94,
+      -1,    -1,    54,    88,    89,    90,    91,    92,    93,    94,
       62,    63,    64,    65,    66,    67,    -1,    69,    -1,    -1,
       72,    73,    74,    -1,    -1,    -1,    -1,    -1,    -1,    48,
-      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    90,    91,
+      -1,    -1,    -1,    -1,    -1,    54,    88,    89,    90,    91,
       92,    93,    94,    62,    63,    64,    65,    66,    67,    -1,
       69,    -1,    -1,    72,    73,    74,    -1,    -1,    -1,    -1,
-      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,    88,
+      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    54,    88,
       89,    90,    91,    92,    93,    94,    62,    63,    64,    65,
       66,    67,    -1,    69,    -1,    -1,    72,    73,    74,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    54,    88,    89,    90,    91,    92,    93,    94,    62,
+      -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,
+      -1,    -1,    88,    89,    90,    91,    92,    93,    94,    62,
       63,    64,    65,    66,    67,    -1,    69,    -1,    -1,    72,
-      73,    74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      73,    74,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
       -1,    -1,    -1,    -1,    -1,    88,    89,    90,    91,    92,
-      93,    94,    56,    96,    -1,    -1,    -1,    -1,    62,    63,
-      64,    65,    66,    67,    -1,    69,    -1,    -1,    72,    73,
-      74,    62,    63,    64,    65,    66,    67,    -1,    69,    -1,
-      -1,    72,    73,    74,    88,    89,    90,    91,    92,    93,
-      94,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    90,
-      91,    92,    93,    94,    -1,    -1,    -1,    98,    62,    63,
+      93,    94,    62,    63,    64,    65,    66,    67,    -1,    69,
+      -1,    -1,    72,    73,    74,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,
+      90,    91,    92,    93,    94,    62,    63,    64,    65,    66,
+      67,    -1,    69,    -1,    -1,    72,    73,    74,    -1,    -1,
+      -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
+      -1,    88,    89,    90,    91,    92,    93,    94,    62,    63,
       64,    65,    66,    67,    -1,    69,    -1,    -1,    72,    73,
-      74,    -1,    -1,    -1,    -1,    -1,    80,    81,    -1,    -1,
+      74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    88,    89,    90,    91,    92,    93,
-      94,    62,    63,    64,    65,    66,    67,    -1,    69,    -1,
-      -1,    72,    73,    74,    62,    63,    64,    65,    -1,    -1,
-      -1,    69,    -1,    -1,    72,    73,    74,    88,    89,    90,
-      91,    92,    93,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      88,    89,    90,    91,    92,    93,    94
+      94,    56,    -1,    -1,    -1,    -1,    -1,    62,    63,    64,
+      65,    66,    67,    -1,    69,    -1,    -1,    72,    73,    74,
+      62,    63,    64,    65,    66,    67,    -1,    69,    -1,    -1,
+      72,    73,    74,    88,    89,    90,    91,    92,    93,    94,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    90,    91,
+      92,    93,    94,    -1,    -1,    -1,    98,    62,    63,    64,
+      65,    66,    67,    -1,    69,    -1,    -1,    72,    73,    74,
+      -1,    -1,    -1,    -1,    -1,    80,    81,    -1,    -1,    -1,
+      -1,    -1,    -1,    88,    89,    90,    91,    92,    93,    94,
+      62,    63,    64,    65,    66,    67,    -1,    69,    -1,    -1,
+      72,    73,    74,    62,    63,    64,    65,    -1,    -1,    -1,
+      69,    -1,    -1,    72,    73,    74,    88,    89,    90,    91,
+      92,    93,    94,    -1,    -1,    -1,    -1,    -1,    -1,    88,
+      89,    90,    91,    92,    93,    94
 };
 
   /* YYSTOSSTATE-NUM -- The (internal number of the) accessing
@@ -1583,38 +1592,38 @@ static const yytype_uint8 yystos[] =
       41,    42,    45,    47,    50,    51,    52,    55,    58,    59,
       60,    61,    68,    75,    76,    77,    78,    79,    82,    83,
       84,    91,    92,    97,   100,   104,   105,   106,   107,   108,
-     119,   125,   128,   129,   130,   131,   132,   139,   141,   143,
-     147,   152,   155,    96,    26,   128,    26,    50,    97,   129,
-     153,    97,   153,   128,    48,    97,   129,   154,   142,   146,
-      51,   133,    46,    47,    48,    49,   129,   140,   144,    51,
+     119,   125,   128,   129,   131,   132,   133,   140,   142,   144,
+     148,   153,   156,    96,    26,   128,    26,    50,    97,   129,
+     154,    97,   154,   128,    48,    97,   129,   155,   143,   147,
+      51,   134,    46,    47,    48,    49,   129,   141,   145,    51,
       20,   129,    56,    57,    17,    18,    19,    26,    33,    26,
-      26,   129,   129,   140,   135,   129,   129,   129,   129,   129,
-     129,   129,   134,   148,   129,   129,   129,    27,    29,   102,
-     129,   156,   157,   158,   159,     0,    96,   129,    62,    63,
+      26,   129,   129,   141,   136,   129,   129,   129,   129,   129,
+     129,   129,   135,   149,   129,   129,   129,    27,    29,   102,
+     129,   157,   158,   159,   160,     0,    96,   129,    62,    63,
       64,    65,    66,    67,    69,    72,    73,    74,    88,    89,
-      90,    91,    92,    93,    94,   126,    97,   129,   129,   153,
-      99,   153,   128,   153,    99,   153,   126,    26,   136,   129,
-      46,   140,    26,    26,    44,    70,    71,    26,   126,    54,
-      64,   128,   128,    54,    64,    54,    53,    56,   140,    26,
-     138,    48,    54,    48,    54,    48,    54,    48,    54,    80,
-      81,    54,    96,    26,   137,    26,    98,   102,   102,   101,
-      99,    99,   104,   122,   129,   129,   129,   129,   129,   129,
+      90,    91,    92,    93,    94,   126,    97,   129,   129,   154,
+      99,   154,   128,    26,   154,    99,   154,   126,    26,   137,
+     129,    46,   141,    26,    26,    44,    70,    71,    26,   126,
+      54,    64,   128,   128,    54,    64,    54,    53,    56,   141,
+      26,   139,    48,    54,    48,    54,    48,    54,    48,    54,
+      80,    81,    54,    96,    26,   138,    26,    98,   102,   102,
+     101,    99,    99,   104,   122,   129,   129,   129,   129,   129,
      129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
-     129,    26,   149,    98,   129,    98,    98,   129,   149,    99,
-     129,   145,   128,    26,   131,   129,   129,    43,    64,   129,
-     129,   129,    54,    64,    48,   129,   129,   129,   129,   129,
-      99,   129,   129,   129,   129,   129,   129,   129,   129,   129,
-     129,   118,   118,    99,   128,   128,   129,    27,    29,   159,
-      53,    96,    99,    96,    26,   126,    44,   129,   129,   122,
-     129,   129,    26,    26,    48,    48,    48,    48,   107,   127,
-      26,   127,   151,    26,   151,   149,   129,   115,   109,   112,
-     127,   128,   129,   129,   129,   129,   126,    96,   108,   126,
-     123,   127,   127,    96,   126,   124,   124,   123,    54,    87,
-     120,    30,   151,   116,   110,   113,    86,   129,    36,    37,
-     121,   126,    26,   150,   127,   122,    54,    35,   127,   129,
-      85,    99,   117,   129,    54,   126,   122,    26,   127,   111,
-     129,    85,    53,    86,   122,   114,   127,   127,   122,   123,
-      86,   127,    86
+     129,   129,    26,   150,    98,   129,    98,    98,    99,    98,
+     129,   150,    99,   129,   146,   128,    26,   132,   129,   129,
+      43,    64,   129,   129,   129,    54,    64,    48,   129,   129,
+     129,   129,   129,    99,   129,   129,   129,   129,   129,   129,
+     129,   129,   129,   129,   118,   118,    99,   128,   128,   129,
+      27,    29,   160,    53,    96,    99,   130,    96,    26,   126,
+      44,   129,   129,   122,   129,   129,    26,    26,    48,    48,
+      48,    48,   107,   127,    26,   127,   152,    26,   155,   152,
+     150,   129,   115,   109,   112,   127,   128,   129,   129,   129,
+     129,   126,    96,   108,   126,   123,   127,    98,   127,    96,
+     126,   124,   124,   123,    54,    87,   120,    30,   152,   116,
+     110,   113,    86,   129,    36,    37,   121,   126,    26,   151,
+     127,   122,    54,    35,   127,   129,    85,    99,   117,   129,
+      54,   126,   122,    26,   127,   111,   129,    85,    53,    86,
+     122,   114,   127,   127,   122,   123,    86,   127,    86
 };
 
   /* YYR1YYN -- Symbol number of symbol that rule YYN derives.  */
@@ -1627,17 +1636,17 @@ static const yytype_uint8 yyr1[] =
      108,   108,   118,   119,   119,   120,   120,   121,   122,   123,
      124,   125,   126,   127,   127,   127,   128,   128,   128,   128,
      128,   128,   128,   128,   128,   128,   129,   129,   129,   129,
+     129,   130,   129,   129,   129,   129,   129,   129,   129,   129,
      129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
      129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
-     129,   129,   129,   129,   129,   129,   129,   130,   130,   130,
-     130,   130,   130,   130,   130,   131,   131,   132,   132,   132,
-     132,   132,   133,   132,   134,   132,   135,   132,   132,   132,
-     132,   132,   136,   136,   137,   137,   138,   138,   139,   139,
-     139,   139,   139,   139,   140,   140,   141,   141,   141,   142,
-     141,   144,   145,   143,   143,   146,   143,   143,   143,   148,
-     147,   149,   149,   149,   150,   150,   150,   151,   152,   153,
-     153,   153,   154,   154,   155,   156,   156,   156,   156,   157,
-     157,   158,   158,   159,   159
+     131,   131,   131,   131,   131,   131,   131,   131,   132,   132,
+     133,   133,   133,   133,   133,   134,   133,   135,   133,   136,
+     133,   133,   133,   133,   133,   137,   137,   138,   138,   139,
+     139,   140,   140,   140,   140,   140,   140,   141,   141,   142,
+     142,   142,   143,   142,   145,   146,   144,   144,   147,   144,
+     144,   144,   149,   148,   150,   150,   150,   151,   151,   151,
+     152,   153,   154,   154,   154,   155,   155,   156,   157,   157,
+     157,   157,   158,   158,   159,   159,   160,   160
 };
 
   /* YYR2YYN -- Number of symbols on the right hand side of rule YYN.  */
@@ -1650,17 +1659,17 @@ static const yytype_int8 yyr2[] =
        7,     6,     0,     9,    11,     0,     2,     6,     0,     0,
        0,     1,     0,     0,     2,     2,     1,     1,     1,     1,
        1,     1,     2,     3,     1,     2,     1,     1,     4,     2,
-       4,     3,     1,     1,     1,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     2,     3,
-       3,     3,     3,     2,     2,     4,     4,     4,     6,     4,
-       6,     4,     6,     4,     6,     2,     1,     2,     1,     1,
-       2,     1,     0,     3,     0,     3,     0,     3,     4,     2,
-       4,     2,     1,     3,     1,     3,     1,     3,     1,     2,
-       2,     2,     3,     2,     3,     2,     2,     3,     2,     0,
-       3,     0,     0,     9,     2,     0,     7,     8,     6,     0,
-       3,     0,     1,     3,     0,     1,     3,     0,     2,     0,
-       1,     3,     1,     3,     3,     0,     1,     1,     1,     1,
-       3,     1,     3,     3,     3
+       4,     0,     7,     4,     3,     1,     1,     1,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     2,     3,     3,     3,     3,     2,     2,     4,     4,
+       4,     6,     4,     6,     4,     6,     4,     6,     2,     1,
+       2,     1,     1,     2,     1,     0,     3,     0,     3,     0,
+       3,     4,     2,     4,     2,     1,     3,     1,     3,     1,
+       3,     1,     2,     2,     2,     3,     2,     3,     2,     2,
+       3,     2,     0,     3,     0,     0,     9,     2,     0,     7,
+       8,     6,     0,     3,     0,     1,     3,     0,     1,     3,
+       0,     2,     0,     1,     3,     1,     3,     3,     0,     1,
+       1,     1,     1,     3,     1,     3,     3,     3
 };
 
 
@@ -1934,79 +1943,79 @@ yydestruct (const char *yymsg,
     case 22: /* BLTIN  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1938 "engines/director/lingo/lingo-gr.cpp"
+#line 1947 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1944 "engines/director/lingo/lingo-gr.cpp"
+#line 1953 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1950 "engines/director/lingo/lingo-gr.cpp"
+#line 1959 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1956 "engines/director/lingo/lingo-gr.cpp"
+#line 1965 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1962 "engines/director/lingo/lingo-gr.cpp"
+#line 1971 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1968 "engines/director/lingo/lingo-gr.cpp"
+#line 1977 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1974 "engines/director/lingo/lingo-gr.cpp"
+#line 1983 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1980 "engines/director/lingo/lingo-gr.cpp"
+#line 1989 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1986 "engines/director/lingo/lingo-gr.cpp"
+#line 1995 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1992 "engines/director/lingo/lingo-gr.cpp"
+#line 2001 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1998 "engines/director/lingo/lingo-gr.cpp"
+#line 2007 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
 #line 184 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2004 "engines/director/lingo/lingo-gr.cpp"
+#line 2013 "engines/director/lingo/lingo-gr.cpp"
         break;
 
-    case 147: /* on  */
+    case 148: /* on  */
 #line 183 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2010 "engines/director/lingo/lingo-gr.cpp"
+#line 2019 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2293,7 +2302,7 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2297 "engines/director/lingo/lingo-gr.cpp"
+#line 2306 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
@@ -2301,7 +2310,7 @@ yyreduce:
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2305 "engines/director/lingo/lingo-gr.cpp"
+#line 2314 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
@@ -2317,19 +2326,19 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2321 "engines/director/lingo/lingo-gr.cpp"
+#line 2330 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
 #line 217 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2327 "engines/director/lingo/lingo-gr.cpp"
+#line 2336 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
 #line 218 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2333 "engines/director/lingo/lingo-gr.cpp"
+#line 2342 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
@@ -2341,7 +2350,7 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2345 "engines/director/lingo/lingo-gr.cpp"
+#line 2354 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
@@ -2353,7 +2362,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2357 "engines/director/lingo/lingo-gr.cpp"
+#line 2366 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
@@ -2365,7 +2374,7 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2369 "engines/director/lingo/lingo-gr.cpp"
+#line 2378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
@@ -2377,7 +2386,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2381 "engines/director/lingo/lingo-gr.cpp"
+#line 2390 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
@@ -2388,7 +2397,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2392 "engines/director/lingo/lingo-gr.cpp"
+#line 2401 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
@@ -2399,7 +2408,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2403 "engines/director/lingo/lingo-gr.cpp"
+#line 2412 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
@@ -2415,7 +2424,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2419 "engines/director/lingo/lingo-gr.cpp"
+#line 2428 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
@@ -2426,7 +2435,7 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2430 "engines/director/lingo/lingo-gr.cpp"
+#line 2439 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
@@ -2437,7 +2446,7 @@ yyreduce:
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2441 "engines/director/lingo/lingo-gr.cpp"
+#line 2450 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
@@ -2445,20 +2454,20 @@ yyreduce:
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2449 "engines/director/lingo/lingo-gr.cpp"
+#line 2458 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
 #line 304 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2456 "engines/director/lingo/lingo-gr.cpp"
+#line 2465 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
 #line 307 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2462 "engines/director/lingo/lingo-gr.cpp"
+#line 2471 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
@@ -2481,7 +2490,7 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2485 "engines/director/lingo/lingo-gr.cpp"
+#line 2494 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
@@ -2489,20 +2498,20 @@ yyreduce:
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2493 "engines/director/lingo/lingo-gr.cpp"
+#line 2502 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
 #line 335 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2500 "engines/director/lingo/lingo-gr.cpp"
+#line 2509 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
 #line 338 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2506 "engines/director/lingo/lingo-gr.cpp"
+#line 2515 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
@@ -2525,7 +2534,7 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2529 "engines/director/lingo/lingo-gr.cpp"
+#line 2538 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
@@ -2536,7 +2545,7 @@ yyreduce:
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2540 "engines/director/lingo/lingo-gr.cpp"
+#line 2549 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
@@ -2546,7 +2555,7 @@ yyreduce:
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2550 "engines/director/lingo/lingo-gr.cpp"
+#line 2559 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
@@ -2561,7 +2570,7 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), kVarLocal);
 				  g_lingo->code1(LC::c_assign); }
-#line 2565 "engines/director/lingo/lingo-gr.cpp"
+#line 2574 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
@@ -2583,14 +2592,14 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2587 "engines/director/lingo/lingo-gr.cpp"
+#line 2596 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
 #line 405 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2594 "engines/director/lingo/lingo-gr.cpp"
+#line 2603 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
@@ -2598,25 +2607,25 @@ yyreduce:
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2602 "engines/director/lingo/lingo-gr.cpp"
+#line 2611 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
 #line 410 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2608 "engines/director/lingo/lingo-gr.cpp"
+#line 2617 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
 #line 411 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2614 "engines/director/lingo/lingo-gr.cpp"
+#line 2623 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
 #line 413 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2620 "engines/director/lingo/lingo-gr.cpp"
+#line 2629 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
@@ -2628,7 +2637,7 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2632 "engines/director/lingo/lingo-gr.cpp"
+#line 2641 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
@@ -2640,7 +2649,7 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2644 "engines/director/lingo/lingo-gr.cpp"
+#line 2653 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
@@ -2650,7 +2659,7 @@ yyreduce:
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2654 "engines/director/lingo/lingo-gr.cpp"
+#line 2663 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
@@ -2658,7 +2667,7 @@ yyreduce:
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2662 "engines/director/lingo/lingo-gr.cpp"
+#line 2671 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
@@ -2666,7 +2675,7 @@ yyreduce:
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2670 "engines/director/lingo/lingo-gr.cpp"
+#line 2679 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
@@ -2674,26 +2683,26 @@ yyreduce:
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2678 "engines/director/lingo/lingo-gr.cpp"
+#line 2687 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
 #line 451 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2685 "engines/director/lingo/lingo-gr.cpp"
+#line 2694 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
 #line 454 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2691 "engines/director/lingo/lingo-gr.cpp"
+#line 2700 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
 #line 456 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2697 "engines/director/lingo/lingo-gr.cpp"
+#line 2706 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
@@ -2701,7 +2710,7 @@ yyreduce:
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2705 "engines/director/lingo/lingo-gr.cpp"
+#line 2714 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
@@ -2709,7 +2718,7 @@ yyreduce:
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2713 "engines/director/lingo/lingo-gr.cpp"
+#line 2722 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
@@ -2718,7 +2727,7 @@ yyreduce:
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2722 "engines/director/lingo/lingo-gr.cpp"
+#line 2731 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
@@ -2727,7 +2736,7 @@ yyreduce:
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2731 "engines/director/lingo/lingo-gr.cpp"
+#line 2740 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
@@ -2736,7 +2745,7 @@ yyreduce:
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2740 "engines/director/lingo/lingo-gr.cpp"
+#line 2749 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
@@ -2749,7 +2758,7 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2753 "engines/director/lingo/lingo-gr.cpp"
+#line 2762 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
@@ -2760,13 +2769,13 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2764 "engines/director/lingo/lingo-gr.cpp"
+#line 2773 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
 #line 492 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2770 "engines/director/lingo/lingo-gr.cpp"
+#line 2779 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
@@ -2781,13 +2790,13 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2785 "engines/director/lingo/lingo-gr.cpp"
+#line 2794 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
 #line 505 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2791 "engines/director/lingo/lingo-gr.cpp"
+#line 2800 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
@@ -2795,7 +2804,7 @@ yyreduce:
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2799 "engines/director/lingo/lingo-gr.cpp"
+#line 2808 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
@@ -2803,505 +2812,531 @@ yyreduce:
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2807 "engines/director/lingo/lingo-gr.cpp"
+#line 2816 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
 #line 513 "engines/director/lingo/lingo-gr.y"
+                                      {
+			g_lingo->code1(LC::c_lazyeval);
+			g_lingo->codeString((yyvsp[-1].s)->c_str());
+			g_lingo->codeFunc((yyvsp[-3].s), 1);
+			delete (yyvsp[-3].s);
+			delete (yyvsp[-1].s); }
+#line 2827 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 71:
+#line 519 "engines/director/lingo/lingo-gr.y"
+                                      { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
+#line 2833 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 72:
+#line 520 "engines/director/lingo/lingo-gr.y"
+                                                    {
+			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
+			delete (yyvsp[-6].s);
+			delete (yyvsp[-4].s); }
+#line 2842 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 73:
+#line 524 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2815 "engines/director/lingo/lingo-gr.cpp"
+#line 2850 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 71:
-#line 516 "engines/director/lingo/lingo-gr.y"
+  case 74:
+#line 527 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2823 "engines/director/lingo/lingo-gr.cpp"
+#line 2858 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 72:
-#line 519 "engines/director/lingo/lingo-gr.y"
+  case 75:
+#line 530 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2833 "engines/director/lingo/lingo-gr.cpp"
+#line 2868 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 73:
-#line 524 "engines/director/lingo/lingo-gr.y"
+  case 76:
+#line 535 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2844 "engines/director/lingo/lingo-gr.cpp"
+#line 2879 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 75:
-#line 531 "engines/director/lingo/lingo-gr.y"
+  case 78:
+#line 542 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2850 "engines/director/lingo/lingo-gr.cpp"
+#line 2885 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 76:
-#line 532 "engines/director/lingo/lingo-gr.y"
+  case 79:
+#line 543 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2856 "engines/director/lingo/lingo-gr.cpp"
+#line 2891 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 77:
-#line 533 "engines/director/lingo/lingo-gr.y"
+  case 80:
+#line 544 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2862 "engines/director/lingo/lingo-gr.cpp"
+#line 2897 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 78:
-#line 534 "engines/director/lingo/lingo-gr.y"
+  case 81:
+#line 545 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2868 "engines/director/lingo/lingo-gr.cpp"
+#line 2903 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 79:
-#line 535 "engines/director/lingo/lingo-gr.y"
+  case 82:
+#line 546 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2874 "engines/director/lingo/lingo-gr.cpp"
+#line 2909 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 80:
-#line 536 "engines/director/lingo/lingo-gr.y"
+  case 83:
+#line 547 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2880 "engines/director/lingo/lingo-gr.cpp"
+#line 2915 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 81:
-#line 537 "engines/director/lingo/lingo-gr.y"
+  case 84:
+#line 548 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2886 "engines/director/lingo/lingo-gr.cpp"
+#line 2921 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 82:
-#line 538 "engines/director/lingo/lingo-gr.y"
+  case 85:
+#line 549 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2892 "engines/director/lingo/lingo-gr.cpp"
+#line 2927 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 83:
-#line 539 "engines/director/lingo/lingo-gr.y"
+  case 86:
+#line 550 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2898 "engines/director/lingo/lingo-gr.cpp"
+#line 2933 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 84:
-#line 540 "engines/director/lingo/lingo-gr.y"
+  case 87:
+#line 551 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2904 "engines/director/lingo/lingo-gr.cpp"
+#line 2939 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 85:
-#line 541 "engines/director/lingo/lingo-gr.y"
+  case 88:
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2910 "engines/director/lingo/lingo-gr.cpp"
+#line 2945 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 86:
-#line 542 "engines/director/lingo/lingo-gr.y"
+  case 89:
+#line 553 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2916 "engines/director/lingo/lingo-gr.cpp"
+#line 2951 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 87:
-#line 543 "engines/director/lingo/lingo-gr.y"
+  case 90:
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2922 "engines/director/lingo/lingo-gr.cpp"
+#line 2957 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 88:
-#line 544 "engines/director/lingo/lingo-gr.y"
+  case 91:
+#line 555 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2928 "engines/director/lingo/lingo-gr.cpp"
+#line 2963 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 89:
-#line 545 "engines/director/lingo/lingo-gr.y"
+  case 92:
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2934 "engines/director/lingo/lingo-gr.cpp"
+#line 2969 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 90:
-#line 546 "engines/director/lingo/lingo-gr.y"
+  case 93:
+#line 557 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2940 "engines/director/lingo/lingo-gr.cpp"
+#line 2975 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 91:
-#line 547 "engines/director/lingo/lingo-gr.y"
+  case 94:
+#line 558 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2946 "engines/director/lingo/lingo-gr.cpp"
+#line 2981 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 92:
-#line 548 "engines/director/lingo/lingo-gr.y"
+  case 95:
+#line 559 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2952 "engines/director/lingo/lingo-gr.cpp"
+#line 2987 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 93:
-#line 549 "engines/director/lingo/lingo-gr.y"
+  case 96:
+#line 560 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 2958 "engines/director/lingo/lingo-gr.cpp"
+#line 2993 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 94:
-#line 550 "engines/director/lingo/lingo-gr.y"
+  case 97:
+#line 561 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 2964 "engines/director/lingo/lingo-gr.cpp"
+#line 2999 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 95:
-#line 551 "engines/director/lingo/lingo-gr.y"
+  case 98:
+#line 562 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 2970 "engines/director/lingo/lingo-gr.cpp"
+#line 3005 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 96:
-#line 552 "engines/director/lingo/lingo-gr.y"
+  case 99:
+#line 563 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 2976 "engines/director/lingo/lingo-gr.cpp"
+#line 3011 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 97:
-#line 554 "engines/director/lingo/lingo-gr.y"
+  case 100:
+#line 565 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 2982 "engines/director/lingo/lingo-gr.cpp"
+#line 3017 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 98:
-#line 555 "engines/director/lingo/lingo-gr.y"
+  case 101:
+#line 566 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 2988 "engines/director/lingo/lingo-gr.cpp"
+#line 3023 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 99:
-#line 556 "engines/director/lingo/lingo-gr.y"
+  case 102:
+#line 567 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 2994 "engines/director/lingo/lingo-gr.cpp"
+#line 3029 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 100:
-#line 557 "engines/director/lingo/lingo-gr.y"
+  case 103:
+#line 568 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3000 "engines/director/lingo/lingo-gr.cpp"
+#line 3035 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 101:
-#line 558 "engines/director/lingo/lingo-gr.y"
+  case 104:
+#line 569 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3006 "engines/director/lingo/lingo-gr.cpp"
+#line 3041 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 102:
-#line 559 "engines/director/lingo/lingo-gr.y"
+  case 105:
+#line 570 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3012 "engines/director/lingo/lingo-gr.cpp"
+#line 3047 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 103:
-#line 560 "engines/director/lingo/lingo-gr.y"
+  case 106:
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3018 "engines/director/lingo/lingo-gr.cpp"
+#line 3053 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 104:
-#line 561 "engines/director/lingo/lingo-gr.y"
+  case 107:
+#line 572 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3024 "engines/director/lingo/lingo-gr.cpp"
+#line 3059 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 105:
-#line 563 "engines/director/lingo/lingo-gr.y"
+  case 108:
+#line 574 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3032 "engines/director/lingo/lingo-gr.cpp"
+#line 3067 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 107:
-#line 568 "engines/director/lingo/lingo-gr.y"
+  case 110:
+#line 579 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3038 "engines/director/lingo/lingo-gr.cpp"
+#line 3073 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 110:
-#line 571 "engines/director/lingo/lingo-gr.y"
+  case 113:
+#line 582 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3044 "engines/director/lingo/lingo-gr.cpp"
+#line 3079 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 111:
-#line 572 "engines/director/lingo/lingo-gr.y"
+  case 114:
+#line 583 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3050 "engines/director/lingo/lingo-gr.cpp"
+#line 3085 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 112:
-#line 573 "engines/director/lingo/lingo-gr.y"
+  case 115:
+#line 584 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3056 "engines/director/lingo/lingo-gr.cpp"
+#line 3091 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 113:
-#line 573 "engines/director/lingo/lingo-gr.y"
+  case 116:
+#line 584 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3062 "engines/director/lingo/lingo-gr.cpp"
+#line 3097 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 114:
-#line 574 "engines/director/lingo/lingo-gr.y"
+  case 117:
+#line 585 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3068 "engines/director/lingo/lingo-gr.cpp"
+#line 3103 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 115:
-#line 574 "engines/director/lingo/lingo-gr.y"
+  case 118:
+#line 585 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3074 "engines/director/lingo/lingo-gr.cpp"
+#line 3109 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 116:
-#line 575 "engines/director/lingo/lingo-gr.y"
+  case 119:
+#line 586 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3080 "engines/director/lingo/lingo-gr.cpp"
+#line 3115 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 117:
-#line 575 "engines/director/lingo/lingo-gr.y"
+  case 120:
+#line 586 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3086 "engines/director/lingo/lingo-gr.cpp"
+#line 3121 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 118:
-#line 576 "engines/director/lingo/lingo-gr.y"
+  case 121:
+#line 587 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3094 "engines/director/lingo/lingo-gr.cpp"
+#line 3129 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 119:
-#line 579 "engines/director/lingo/lingo-gr.y"
+  case 122:
+#line 590 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3102 "engines/director/lingo/lingo-gr.cpp"
+#line 3137 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 120:
-#line 582 "engines/director/lingo/lingo-gr.y"
+  case 123:
+#line 593 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3108 "engines/director/lingo/lingo-gr.cpp"
+#line 3143 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 121:
-#line 583 "engines/director/lingo/lingo-gr.y"
+  case 124:
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3114 "engines/director/lingo/lingo-gr.cpp"
+#line 3149 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 122:
-#line 585 "engines/director/lingo/lingo-gr.y"
+  case 125:
+#line 596 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3124 "engines/director/lingo/lingo-gr.cpp"
+#line 3159 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 123:
-#line 590 "engines/director/lingo/lingo-gr.y"
+  case 126:
+#line 601 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3134 "engines/director/lingo/lingo-gr.cpp"
+#line 3169 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 124:
-#line 596 "engines/director/lingo/lingo-gr.y"
+  case 127:
+#line 607 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3144 "engines/director/lingo/lingo-gr.cpp"
+#line 3179 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 125:
-#line 601 "engines/director/lingo/lingo-gr.y"
+  case 128:
+#line 612 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3154 "engines/director/lingo/lingo-gr.cpp"
+#line 3189 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 126:
-#line 607 "engines/director/lingo/lingo-gr.y"
+  case 129:
+#line 618 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3162 "engines/director/lingo/lingo-gr.cpp"
+#line 3197 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 127:
-#line 610 "engines/director/lingo/lingo-gr.y"
+  case 130:
+#line 621 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3170 "engines/director/lingo/lingo-gr.cpp"
+#line 3205 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 128:
-#line 621 "engines/director/lingo/lingo-gr.y"
+  case 131:
+#line 632 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3176 "engines/director/lingo/lingo-gr.cpp"
+#line 3211 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 129:
-#line 622 "engines/director/lingo/lingo-gr.y"
+  case 132:
+#line 633 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3182 "engines/director/lingo/lingo-gr.cpp"
+#line 3217 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 130:
-#line 623 "engines/director/lingo/lingo-gr.y"
+  case 133:
+#line 634 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3188 "engines/director/lingo/lingo-gr.cpp"
+#line 3223 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 131:
-#line 624 "engines/director/lingo/lingo-gr.y"
+  case 134:
+#line 635 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3197 "engines/director/lingo/lingo-gr.cpp"
+#line 3232 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 132:
-#line 628 "engines/director/lingo/lingo-gr.y"
+  case 135:
+#line 639 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3206 "engines/director/lingo/lingo-gr.cpp"
+#line 3241 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 133:
-#line 632 "engines/director/lingo/lingo-gr.y"
+  case 136:
+#line 643 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3215 "engines/director/lingo/lingo-gr.cpp"
+#line 3250 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 136:
-#line 640 "engines/director/lingo/lingo-gr.y"
+  case 139:
+#line 651 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3224 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 137:
-#line 644 "engines/director/lingo/lingo-gr.y"
+  case 140:
+#line 655 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3233 "engines/director/lingo/lingo-gr.cpp"
+#line 3268 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 138:
-#line 648 "engines/director/lingo/lingo-gr.y"
+  case 141:
+#line 659 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3242 "engines/director/lingo/lingo-gr.cpp"
+#line 3277 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 139:
-#line 652 "engines/director/lingo/lingo-gr.y"
+  case 142:
+#line 663 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3248 "engines/director/lingo/lingo-gr.cpp"
+#line 3283 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 140:
-#line 652 "engines/director/lingo/lingo-gr.y"
+  case 143:
+#line 663 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3257 "engines/director/lingo/lingo-gr.cpp"
+#line 3292 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 141:
-#line 682 "engines/director/lingo/lingo-gr.y"
+  case 144:
+#line 693 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3263 "engines/director/lingo/lingo-gr.cpp"
+#line 3298 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 142:
-#line 682 "engines/director/lingo/lingo-gr.y"
+  case 145:
+#line 693 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3269 "engines/director/lingo/lingo-gr.cpp"
+#line 3304 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 143:
-#line 683 "engines/director/lingo/lingo-gr.y"
+  case 146:
+#line 694 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3279 "engines/director/lingo/lingo-gr.cpp"
+#line 3314 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 144:
-#line 688 "engines/director/lingo/lingo-gr.y"
+  case 147:
+#line 699 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3285 "engines/director/lingo/lingo-gr.cpp"
+#line 3320 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 145:
-#line 689 "engines/director/lingo/lingo-gr.y"
+  case 148:
+#line 700 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3291 "engines/director/lingo/lingo-gr.cpp"
+#line 3326 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 146:
-#line 690 "engines/director/lingo/lingo-gr.y"
+  case 149:
+#line 701 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3301 "engines/director/lingo/lingo-gr.cpp"
+#line 3336 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 147:
-#line 695 "engines/director/lingo/lingo-gr.y"
+  case 150:
+#line 706 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3310,70 +3345,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3314 "engines/director/lingo/lingo-gr.cpp"
+#line 3349 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 148:
-#line 703 "engines/director/lingo/lingo-gr.y"
+  case 151:
+#line 714 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3324 "engines/director/lingo/lingo-gr.cpp"
+#line 3359 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 149:
-#line 709 "engines/director/lingo/lingo-gr.y"
+  case 152:
+#line 720 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3330 "engines/director/lingo/lingo-gr.cpp"
+#line 3365 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 150:
-#line 709 "engines/director/lingo/lingo-gr.y"
+  case 153:
+#line 720 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
-#line 3337 "engines/director/lingo/lingo-gr.cpp"
+#line 3372 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 151:
-#line 712 "engines/director/lingo/lingo-gr.y"
+  case 154:
+#line 723 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3343 "engines/director/lingo/lingo-gr.cpp"
+#line 3378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 152:
-#line 713 "engines/director/lingo/lingo-gr.y"
+  case 155:
+#line 724 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3349 "engines/director/lingo/lingo-gr.cpp"
+#line 3384 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 153:
-#line 714 "engines/director/lingo/lingo-gr.y"
+  case 156:
+#line 725 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3355 "engines/director/lingo/lingo-gr.cpp"
+#line 3390 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 155:
-#line 717 "engines/director/lingo/lingo-gr.y"
+  case 158:
+#line 728 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3361 "engines/director/lingo/lingo-gr.cpp"
+#line 3396 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 156:
-#line 718 "engines/director/lingo/lingo-gr.y"
+  case 159:
+#line 729 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3367 "engines/director/lingo/lingo-gr.cpp"
+#line 3402 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 157:
-#line 720 "engines/director/lingo/lingo-gr.y"
+  case 160:
+#line 731 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3373 "engines/director/lingo/lingo-gr.cpp"
+#line 3408 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 158:
-#line 722 "engines/director/lingo/lingo-gr.y"
+  case 161:
+#line 733 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3381,113 +3416,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3385 "engines/director/lingo/lingo-gr.cpp"
+#line 3420 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 159:
-#line 730 "engines/director/lingo/lingo-gr.y"
+  case 162:
+#line 741 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3391 "engines/director/lingo/lingo-gr.cpp"
+#line 3426 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 160:
-#line 731 "engines/director/lingo/lingo-gr.y"
+  case 163:
+#line 742 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3397 "engines/director/lingo/lingo-gr.cpp"
+#line 3432 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 161:
-#line 732 "engines/director/lingo/lingo-gr.y"
+  case 164:
+#line 743 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3403 "engines/director/lingo/lingo-gr.cpp"
+#line 3438 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 162:
-#line 734 "engines/director/lingo/lingo-gr.y"
+  case 165:
+#line 745 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3409 "engines/director/lingo/lingo-gr.cpp"
+#line 3444 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 163:
-#line 735 "engines/director/lingo/lingo-gr.y"
+  case 166:
+#line 746 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3415 "engines/director/lingo/lingo-gr.cpp"
+#line 3450 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 164:
-#line 737 "engines/director/lingo/lingo-gr.y"
+  case 167:
+#line 748 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3421 "engines/director/lingo/lingo-gr.cpp"
+#line 3456 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 165:
-#line 739 "engines/director/lingo/lingo-gr.y"
+  case 168:
+#line 750 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3427 "engines/director/lingo/lingo-gr.cpp"
+#line 3462 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 166:
-#line 740 "engines/director/lingo/lingo-gr.y"
+  case 169:
+#line 751 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3433 "engines/director/lingo/lingo-gr.cpp"
+#line 3468 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 167:
-#line 741 "engines/director/lingo/lingo-gr.y"
+  case 170:
+#line 752 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3439 "engines/director/lingo/lingo-gr.cpp"
+#line 3474 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 168:
-#line 742 "engines/director/lingo/lingo-gr.y"
+  case 171:
+#line 753 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3445 "engines/director/lingo/lingo-gr.cpp"
+#line 3480 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 169:
-#line 744 "engines/director/lingo/lingo-gr.y"
+  case 172:
+#line 755 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3451 "engines/director/lingo/lingo-gr.cpp"
+#line 3486 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 170:
-#line 745 "engines/director/lingo/lingo-gr.y"
+  case 173:
+#line 756 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3457 "engines/director/lingo/lingo-gr.cpp"
+#line 3492 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 171:
-#line 747 "engines/director/lingo/lingo-gr.y"
+  case 174:
+#line 758 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3463 "engines/director/lingo/lingo-gr.cpp"
+#line 3498 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 172:
-#line 748 "engines/director/lingo/lingo-gr.y"
+  case 175:
+#line 759 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3469 "engines/director/lingo/lingo-gr.cpp"
+#line 3504 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 173:
-#line 750 "engines/director/lingo/lingo-gr.y"
+  case 176:
+#line 761 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3478 "engines/director/lingo/lingo-gr.cpp"
+#line 3513 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 174:
-#line 754 "engines/director/lingo/lingo-gr.y"
+  case 177:
+#line 765 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3487 "engines/director/lingo/lingo-gr.cpp"
+#line 3522 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3491 "engines/director/lingo/lingo-gr.cpp"
+#line 3526 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3686,7 +3721,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 760 "engines/director/lingo/lingo-gr.y"
+#line 771 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index e52459bb76..97d7e418c6 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -510,6 +510,17 @@ expr: simpleexpr { $$ = $simpleexpr; }
 	| FBLTIN arglist	{
 		g_lingo->codeFunc($FBLTIN, $arglist);
 		delete $FBLTIN; }
+	| ID[func] '(' ID[method] ')' {
+			g_lingo->code1(LC::c_lazyeval);
+			g_lingo->codeString($method->c_str());
+			g_lingo->codeFunc($func, 1);
+			delete $func;
+			delete $method; }
+	| ID[func] '(' ID[method] ',' { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString($method->c_str()); }
+				nonemptyarglist ')' {
+			g_lingo->codeFunc($func, $nonemptyarglist + 1);
+			delete $func;
+			delete $method; }
 	| ID '(' arglist ')'	{
 		$$ = g_lingo->codeFunc($ID, $arglist);
 		delete $ID; }
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 23347df311..45ef7a5a85 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -61,15 +61,6 @@ void Lingo::initMethods() {
 		sym.parens = false;
 		sym.u.bltin = mtd->func;
 		_methods[mtd->name] = sym;
-
-		// FIXME: Method names can conflict with vars. This won't work all the time.
-		Common::String name(mtd->name);
-		Datum target(name);
-		target.type = VAR;
-		Datum source(name);
-		source.type = SYMBOL;
-		g_lingo->varCreate(name, true);
-		g_lingo->varAssign(target, source, true);
 	}
 }
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 1bb061056c..d4a1ced419 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -522,6 +522,15 @@ int Lingo::getAlignedType(Datum &d1, Datum &d2) {
 	return opType;
 }
 
+Datum Datum::eval() {
+	if (type != VAR) { // It could be cast ref
+		lazy = false;
+		return *this;
+	}
+
+	return g_lingo->varFetch(*this);
+}
+
 int Datum::asInt() {
 	int res = 0;
 
@@ -693,6 +702,10 @@ Common::String Datum::asString(bool printonly) {
 		warning("Incorrect operation asString() for type: %s", type2str());
 	}
 
+	if (lazy) {
+		s += " (lazy)";
+	}
+
 	return s;
 }
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 16ff91232c..841e266ce7 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -112,6 +112,7 @@ struct Symbol {	/* symbol table entry */
 
 struct Datum {	/* interpreter stack type */
 	int type;
+	bool lazy; // evaluate when popped off stack
 
 	union {
 		int	i;				/* INT, ARGC, ARGCNORET */
@@ -127,11 +128,13 @@ struct Datum {	/* interpreter stack type */
 	Datum() {
 		u.s = nullptr;
 		type = VOID;
+		lazy = false;
 		refCount = new int;
 		*refCount = 1;
 	}
 	Datum(const Datum &d) {
 		type = d.type;
+		lazy = d.lazy;
 		u = d.u;
 		refCount = d.refCount;
 		*refCount += 1;
@@ -149,18 +152,21 @@ struct Datum {	/* interpreter stack type */
 	Datum(int val) {
 		u.i = val;
 		type = INT;
+		lazy = false;
 		refCount = new int;
 		*refCount = 1;
 	}
 	Datum(double val) {
 		u.f = val;
 		type = FLOAT;
+		lazy = false;
 		refCount = new int;
 		*refCount = 1;
 	}
 	Datum(const Common::String &val) {
 		u.s = new Common::String(val);
 		type = STRING;
+		lazy = false;
 		refCount = new int;
 		*refCount = 1;
 	}
@@ -201,6 +207,7 @@ struct Datum {	/* interpreter stack type */
 		reset();
 	}
 
+	Datum eval();
 	double asFloat();
 	int asInt();
 	Common::String asString(bool printonly = false);
@@ -364,9 +371,9 @@ public:
 	Symbol codeDefine(Common::String &s, int start, int nargs, Object *obj = nullptr, int end = -1, bool removeCode = true);
 	void processIf(int toplabel, int endlabel);
 	int castIdFetch(Datum &var);
-	void varCreate(const Common::String &name, bool global);
-	void varAssign(Datum &var, Datum &value, bool global = false);
-	Datum varFetch(Datum &var, bool global = false);
+	void varCreate(const Common::String &name, bool global, SymbolHash *localvars = nullptr);
+	void varAssign(Datum &var, Datum &value, bool global = false, SymbolHash *localvars = nullptr);
+	Datum varFetch(Datum &var, bool global = false, SymbolHash *localvars = nullptr);
 
 	int getAlignedType(Datum &d1, Datum &d2);
 


Commit: 99755d8cf5b9a8366887f9bbc1c9aedd944d43a6
    https://github.com/scummvm/scummvm/commit/99755d8cf5b9a8366887f9bbc1c9aedd944d43a6
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Improve object printing

This differentiates the parent and child objects with a number.

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 8d47d3d067..f2cc7a351d 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1262,7 +1262,7 @@ void LC::call(const Common::String &name, int nargs) {
 		eventName.type = VAR;
 		Datum d = g_lingo->varFetch(eventName);
 		if (d.type == OBJECT) {
-			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to %s", name.c_str(), d.u.obj->name->c_str());
+			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to <%s>", name.c_str(), d.asString(true).c_str());
 			Object *target = d.u.obj;
 			Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
 			nargs -= 1;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index d4a1ced419..d5fdba49a6 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -634,19 +634,7 @@ Common::String Datum::asString(bool printonly) {
 		if (!printonly) {
 			s = Common::String::format("#%s", u.obj->name->c_str());
 		} else {
-			s = Common::String::format("object: #%s properties: [", u.obj->name->c_str());
-			for (SymbolHash::iterator i = u.obj->properties.begin(); i != u.obj->properties.end(); ++i) {
-				if (i != u.obj->properties.begin())
-					s += ", ";
-				s += (*i)._key.c_str();
-			}
-			s += "] methods: [";
-			for (SymbolHash::iterator i = u.obj->methods.begin(); i != u.obj->methods.end(); ++i) {
-				if (i != u.obj->methods.begin())
-					s += ", ";
-				s += (*i)._key.c_str();
-			}
-			s += "]";
+			s = Common::String::format("object: #%s %d", u.obj->name->c_str(), u.obj->inheritanceLevel);
 		}
 		break;
 	case VOID:


Commit: 68e6b915a337377a430d0367f1b7427a0691fd0e
    https://github.com/scummvm/scummvm/commit/68e6b915a337377a430d0367f1b7427a0691fd0e
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix vars in global scope

Changed paths:
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y


diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 5157aaefa2..68d12e5628 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -127,6 +127,15 @@ static void endDef() {
 	g_lingo->_methodVarsStash = nullptr;
 }
 
+static VarType globalCheck() {
+	// If in a definition, assume variables are local unless
+	// they were declared global with `global varname`
+	if (g_lingo->_indef == kStateInDef) {
+		return kVarLocal;
+	}
+	return kVarGlobal;
+}
+
 static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
@@ -142,7 +151,7 @@ static void mVar(Common::String *s, VarType type) {
 }
 
 
-#line 146 "engines/director/lingo/lingo-gr.cpp"
+#line 155 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -279,7 +288,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 129 "engines/director/lingo/lingo-gr.y"
+#line 138 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -299,7 +308,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 303 "engines/director/lingo/lingo-gr.cpp"
+#line 312 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -853,24 +862,24 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   188,   188,   189,   191,   192,   193,   195,   202,   206,
-     217,   218,   219,   226,   233,   240,   247,   253,   260,   271,
-     278,   279,   280,   282,   283,   288,   300,   304,   307,   299,
-     331,   335,   338,   330,   364,   371,   377,   363,   405,   407,
-     410,   411,   413,   415,   422,   430,   431,   433,   439,   443,
-     447,   451,   454,   456,   457,   458,   460,   463,   466,   470,
-     474,   478,   486,   492,   493,   494,   505,   506,   507,   510,
-     513,   519,   519,   524,   527,   530,   535,   541,   542,   543,
-     544,   545,   546,   547,   548,   549,   550,   551,   552,   553,
-     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
-     565,   566,   567,   568,   569,   570,   571,   572,   574,   577,
-     579,   580,   581,   582,   583,   584,   584,   585,   585,   586,
-     586,   587,   590,   593,   594,   596,   601,   607,   612,   618,
-     621,   632,   633,   634,   635,   639,   643,   648,   649,   651,
-     655,   659,   663,   663,   693,   693,   693,   699,   700,   700,
-     706,   714,   720,   720,   723,   724,   725,   727,   728,   729,
-     731,   733,   741,   742,   743,   745,   746,   748,   750,   751,
-     752,   753,   755,   756,   758,   759,   761,   765
+       0,   197,   197,   198,   200,   201,   202,   204,   211,   215,
+     226,   227,   228,   235,   242,   249,   256,   262,   269,   280,
+     287,   288,   289,   291,   292,   297,   309,   313,   316,   308,
+     340,   344,   347,   339,   373,   380,   386,   372,   414,   416,
+     419,   420,   422,   424,   431,   439,   440,   442,   448,   452,
+     456,   460,   463,   465,   466,   467,   469,   472,   475,   479,
+     483,   487,   495,   501,   502,   503,   514,   515,   516,   519,
+     522,   528,   528,   533,   536,   539,   544,   550,   551,   552,
+     553,   554,   555,   556,   557,   558,   559,   560,   561,   562,
+     563,   564,   565,   566,   567,   568,   569,   570,   571,   572,
+     574,   575,   576,   577,   578,   579,   580,   581,   583,   586,
+     588,   589,   590,   591,   592,   593,   593,   594,   594,   595,
+     595,   596,   599,   602,   603,   605,   610,   616,   621,   627,
+     630,   641,   642,   643,   644,   648,   652,   657,   658,   660,
+     664,   668,   672,   672,   702,   702,   702,   708,   709,   709,
+     715,   723,   729,   729,   732,   733,   734,   736,   737,   738,
+     740,   742,   750,   751,   752,   754,   755,   757,   759,   760,
+     761,   762,   764,   765,   767,   768,   770,   774
 };
 #endif
 
@@ -1941,81 +1950,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1947 "engines/director/lingo/lingo-gr.cpp"
+#line 1956 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1953 "engines/director/lingo/lingo-gr.cpp"
+#line 1962 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1959 "engines/director/lingo/lingo-gr.cpp"
+#line 1968 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1965 "engines/director/lingo/lingo-gr.cpp"
+#line 1974 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1971 "engines/director/lingo/lingo-gr.cpp"
+#line 1980 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1977 "engines/director/lingo/lingo-gr.cpp"
+#line 1986 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1983 "engines/director/lingo/lingo-gr.cpp"
+#line 1992 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1989 "engines/director/lingo/lingo-gr.cpp"
+#line 1998 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1995 "engines/director/lingo/lingo-gr.cpp"
+#line 2004 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2001 "engines/director/lingo/lingo-gr.cpp"
+#line 2010 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2007 "engines/director/lingo/lingo-gr.cpp"
+#line 2016 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 184 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2013 "engines/director/lingo/lingo-gr.cpp"
+#line 2022 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 148: /* on  */
-#line 183 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2019 "engines/director/lingo/lingo-gr.cpp"
+#line 2028 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2294,27 +2303,27 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 195 "engines/director/lingo/lingo-gr.y"
+#line 204 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
-		mVar((yyvsp[0].s), kVarLocal);
+		mVar((yyvsp[0].s), globalCheck());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2306 "engines/director/lingo/lingo-gr.cpp"
+#line 2315 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 202 "engines/director/lingo/lingo-gr.y"
+#line 211 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2314 "engines/director/lingo/lingo-gr.cpp"
+#line 2323 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 206 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2326,35 +2335,35 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2330 "engines/director/lingo/lingo-gr.cpp"
+#line 2339 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 217 "engines/director/lingo/lingo-gr.y"
+#line 226 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2336 "engines/director/lingo/lingo-gr.cpp"
+#line 2345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 218 "engines/director/lingo/lingo-gr.y"
+#line 227 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2342 "engines/director/lingo/lingo-gr.cpp"
+#line 2351 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 219 "engines/director/lingo/lingo-gr.y"
+#line 228 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
-		mVar((yyvsp[-2].s), kVarLocal);
+		mVar((yyvsp[-2].s), globalCheck());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2354 "engines/director/lingo/lingo-gr.cpp"
+#line 2363 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 226 "engines/director/lingo/lingo-gr.y"
+#line 235 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2362,23 +2371,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2366 "engines/director/lingo/lingo-gr.cpp"
+#line 2375 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 233 "engines/director/lingo/lingo-gr.y"
+#line 242 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
-		mVar((yyvsp[-2].s), kVarLocal);
+		mVar((yyvsp[-2].s), globalCheck());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2378 "engines/director/lingo/lingo-gr.cpp"
+#line 2387 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 240 "engines/director/lingo/lingo-gr.y"
+#line 249 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2386,33 +2395,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2390 "engines/director/lingo/lingo-gr.cpp"
+#line 2399 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 247 "engines/director/lingo/lingo-gr.y"
+#line 256 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2401 "engines/director/lingo/lingo-gr.cpp"
+#line 2410 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 253 "engines/director/lingo/lingo-gr.y"
+#line 262 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2412 "engines/director/lingo/lingo-gr.cpp"
+#line 2421 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 260 "engines/director/lingo/lingo-gr.y"
+#line 269 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2424,54 +2433,54 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2428 "engines/director/lingo/lingo-gr.cpp"
+#line 2437 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 271 "engines/director/lingo/lingo-gr.y"
+#line 280 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2439 "engines/director/lingo/lingo-gr.cpp"
+#line 2448 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 288 "engines/director/lingo/lingo-gr.y"
+#line 297 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-5].code) - (yyvsp[-1].code) + 1);
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2450 "engines/director/lingo/lingo-gr.cpp"
+#line 2459 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 300 "engines/director/lingo/lingo-gr.y"
+#line 309 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
-				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2458 "engines/director/lingo/lingo-gr.cpp"
+				  mVar((yyvsp[-2].s), globalCheck()); }
+#line 2467 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 304 "engines/director/lingo/lingo-gr.y"
+#line 313 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2465 "engines/director/lingo/lingo-gr.cpp"
+#line 2474 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 307 "engines/director/lingo/lingo-gr.y"
+#line 316 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2471 "engines/director/lingo/lingo-gr.cpp"
+#line 2480 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 307 "engines/director/lingo/lingo-gr.y"
+#line 316 "engines/director/lingo/lingo-gr.y"
                                                                                           {
 
 		g_lingo->code1(LC::c_eval);
@@ -2490,32 +2499,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2494 "engines/director/lingo/lingo-gr.cpp"
+#line 2503 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 331 "engines/director/lingo/lingo-gr.y"
+#line 340 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
-				  mVar((yyvsp[-2].s), kVarLocal); }
-#line 2502 "engines/director/lingo/lingo-gr.cpp"
+				  mVar((yyvsp[-2].s), globalCheck()); }
+#line 2511 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 335 "engines/director/lingo/lingo-gr.y"
+#line 344 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2509 "engines/director/lingo/lingo-gr.cpp"
+#line 2518 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 338 "engines/director/lingo/lingo-gr.y"
+#line 347 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2515 "engines/director/lingo/lingo-gr.cpp"
+#line 2524 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 339 "engines/director/lingo/lingo-gr.y"
+#line 348 "engines/director/lingo/lingo-gr.y"
                                                     {
 
 		g_lingo->code1(LC::c_eval);
@@ -2534,32 +2543,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2538 "engines/director/lingo/lingo-gr.cpp"
+#line 2547 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 364 "engines/director/lingo/lingo-gr.y"
+#line 373 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2549 "engines/director/lingo/lingo-gr.cpp"
+#line 2558 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 371 "engines/director/lingo/lingo-gr.y"
+#line 380 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2559 "engines/director/lingo/lingo-gr.cpp"
+#line 2568 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 377 "engines/director/lingo/lingo-gr.y"
+#line 386 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2568,13 +2577,13 @@ yyreduce:
 				  g_lingo->codeFunc(&getAt, 2);
 				  g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
-				  mVar((yyvsp[-6].s), kVarLocal);
+				  mVar((yyvsp[-6].s), globalCheck());
 				  g_lingo->code1(LC::c_assign); }
-#line 2574 "engines/director/lingo/lingo-gr.cpp"
+#line 2583 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 387 "engines/director/lingo/lingo-gr.y"
+#line 396 "engines/director/lingo/lingo-gr.y"
                                             {
 
 		g_lingo->code1(LC::c_intpush);
@@ -2592,44 +2601,44 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2596 "engines/director/lingo/lingo-gr.cpp"
+#line 2605 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 405 "engines/director/lingo/lingo-gr.y"
+#line 414 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2603 "engines/director/lingo/lingo-gr.cpp"
+#line 2612 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 407 "engines/director/lingo/lingo-gr.y"
+#line 416 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2611 "engines/director/lingo/lingo-gr.cpp"
+#line 2620 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 410 "engines/director/lingo/lingo-gr.y"
+#line 419 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2617 "engines/director/lingo/lingo-gr.cpp"
+#line 2626 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 411 "engines/director/lingo/lingo-gr.y"
+#line 420 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2623 "engines/director/lingo/lingo-gr.cpp"
+#line 2632 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 413 "engines/director/lingo/lingo-gr.y"
+#line 422 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2629 "engines/director/lingo/lingo-gr.cpp"
+#line 2638 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 415 "engines/director/lingo/lingo-gr.y"
+#line 424 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2637,11 +2646,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2641 "engines/director/lingo/lingo-gr.cpp"
+#line 2650 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 422 "engines/director/lingo/lingo-gr.y"
+#line 431 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2649,107 +2658,107 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2653 "engines/director/lingo/lingo-gr.cpp"
+#line 2662 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 433 "engines/director/lingo/lingo-gr.y"
+#line 442 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2663 "engines/director/lingo/lingo-gr.cpp"
+#line 2672 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 439 "engines/director/lingo/lingo-gr.y"
+#line 448 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2671 "engines/director/lingo/lingo-gr.cpp"
+#line 2680 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 443 "engines/director/lingo/lingo-gr.y"
+#line 452 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2679 "engines/director/lingo/lingo-gr.cpp"
+#line 2688 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 447 "engines/director/lingo/lingo-gr.y"
+#line 456 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2687 "engines/director/lingo/lingo-gr.cpp"
+#line 2696 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 451 "engines/director/lingo/lingo-gr.y"
+#line 460 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2694 "engines/director/lingo/lingo-gr.cpp"
+#line 2703 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 454 "engines/director/lingo/lingo-gr.y"
+#line 463 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2700 "engines/director/lingo/lingo-gr.cpp"
+#line 2709 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 456 "engines/director/lingo/lingo-gr.y"
+#line 465 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2706 "engines/director/lingo/lingo-gr.cpp"
+#line 2715 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 460 "engines/director/lingo/lingo-gr.y"
+#line 469 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2714 "engines/director/lingo/lingo-gr.cpp"
+#line 2723 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 463 "engines/director/lingo/lingo-gr.y"
+#line 472 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2722 "engines/director/lingo/lingo-gr.cpp"
+#line 2731 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 466 "engines/director/lingo/lingo-gr.y"
+#line 475 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2731 "engines/director/lingo/lingo-gr.cpp"
+#line 2740 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 470 "engines/director/lingo/lingo-gr.y"
+#line 479 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2740 "engines/director/lingo/lingo-gr.cpp"
+#line 2749 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 474 "engines/director/lingo/lingo-gr.y"
+#line 483 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2749 "engines/director/lingo/lingo-gr.cpp"
+#line 2758 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 478 "engines/director/lingo/lingo-gr.y"
+#line 487 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2758,28 +2767,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2762 "engines/director/lingo/lingo-gr.cpp"
+#line 2771 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 486 "engines/director/lingo/lingo-gr.y"
+#line 495 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2773 "engines/director/lingo/lingo-gr.cpp"
+#line 2782 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 501 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2779 "engines/director/lingo/lingo-gr.cpp"
+#line 2788 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 494 "engines/director/lingo/lingo-gr.y"
+#line 503 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2790,553 +2799,553 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2794 "engines/director/lingo/lingo-gr.cpp"
+#line 2803 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 505 "engines/director/lingo/lingo-gr.y"
+#line 514 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2800 "engines/director/lingo/lingo-gr.cpp"
+#line 2809 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 507 "engines/director/lingo/lingo-gr.y"
+#line 516 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2808 "engines/director/lingo/lingo-gr.cpp"
+#line 2817 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 510 "engines/director/lingo/lingo-gr.y"
+#line 519 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2816 "engines/director/lingo/lingo-gr.cpp"
+#line 2825 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 513 "engines/director/lingo/lingo-gr.y"
+#line 522 "engines/director/lingo/lingo-gr.y"
                                       {
 			g_lingo->code1(LC::c_lazyeval);
 			g_lingo->codeString((yyvsp[-1].s)->c_str());
 			g_lingo->codeFunc((yyvsp[-3].s), 1);
 			delete (yyvsp[-3].s);
 			delete (yyvsp[-1].s); }
-#line 2827 "engines/director/lingo/lingo-gr.cpp"
+#line 2836 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 519 "engines/director/lingo/lingo-gr.y"
+#line 528 "engines/director/lingo/lingo-gr.y"
                                       { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
-#line 2833 "engines/director/lingo/lingo-gr.cpp"
+#line 2842 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 520 "engines/director/lingo/lingo-gr.y"
+#line 529 "engines/director/lingo/lingo-gr.y"
                                                     {
 			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
 			delete (yyvsp[-6].s);
 			delete (yyvsp[-4].s); }
-#line 2842 "engines/director/lingo/lingo-gr.cpp"
+#line 2851 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 524 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2850 "engines/director/lingo/lingo-gr.cpp"
+#line 2859 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 536 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2858 "engines/director/lingo/lingo-gr.cpp"
+#line 2867 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 530 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2868 "engines/director/lingo/lingo-gr.cpp"
+#line 2877 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 544 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2879 "engines/director/lingo/lingo-gr.cpp"
+#line 2888 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 542 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2885 "engines/director/lingo/lingo-gr.cpp"
+#line 2894 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 543 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2891 "engines/director/lingo/lingo-gr.cpp"
+#line 2900 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 553 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2897 "engines/director/lingo/lingo-gr.cpp"
+#line 2906 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 545 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2903 "engines/director/lingo/lingo-gr.cpp"
+#line 2912 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 546 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2909 "engines/director/lingo/lingo-gr.cpp"
+#line 2918 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 547 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2915 "engines/director/lingo/lingo-gr.cpp"
+#line 2924 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 548 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2921 "engines/director/lingo/lingo-gr.cpp"
+#line 2930 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 549 "engines/director/lingo/lingo-gr.y"
+#line 558 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2927 "engines/director/lingo/lingo-gr.cpp"
+#line 2936 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 550 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2933 "engines/director/lingo/lingo-gr.cpp"
+#line 2942 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 551 "engines/director/lingo/lingo-gr.y"
+#line 560 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2939 "engines/director/lingo/lingo-gr.cpp"
+#line 2948 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 552 "engines/director/lingo/lingo-gr.y"
+#line 561 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2945 "engines/director/lingo/lingo-gr.cpp"
+#line 2954 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 562 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2951 "engines/director/lingo/lingo-gr.cpp"
+#line 2960 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 554 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2957 "engines/director/lingo/lingo-gr.cpp"
+#line 2966 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 555 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2963 "engines/director/lingo/lingo-gr.cpp"
+#line 2972 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2969 "engines/director/lingo/lingo-gr.cpp"
+#line 2978 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2975 "engines/director/lingo/lingo-gr.cpp"
+#line 2984 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 567 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2981 "engines/director/lingo/lingo-gr.cpp"
+#line 2990 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 568 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2987 "engines/director/lingo/lingo-gr.cpp"
+#line 2996 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 569 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 2993 "engines/director/lingo/lingo-gr.cpp"
+#line 3002 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 2999 "engines/director/lingo/lingo-gr.cpp"
+#line 3008 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 562 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 3005 "engines/director/lingo/lingo-gr.cpp"
+#line 3014 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 563 "engines/director/lingo/lingo-gr.y"
+#line 572 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 3011 "engines/director/lingo/lingo-gr.cpp"
+#line 3020 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 565 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 3017 "engines/director/lingo/lingo-gr.cpp"
+#line 3026 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 3023 "engines/director/lingo/lingo-gr.cpp"
+#line 3032 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 576 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 3029 "engines/director/lingo/lingo-gr.cpp"
+#line 3038 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 577 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3035 "engines/director/lingo/lingo-gr.cpp"
+#line 3044 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 569 "engines/director/lingo/lingo-gr.y"
+#line 578 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3041 "engines/director/lingo/lingo-gr.cpp"
+#line 3050 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 579 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3047 "engines/director/lingo/lingo-gr.cpp"
+#line 3056 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 580 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3053 "engines/director/lingo/lingo-gr.cpp"
+#line 3062 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 572 "engines/director/lingo/lingo-gr.y"
+#line 581 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3059 "engines/director/lingo/lingo-gr.cpp"
+#line 3068 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 108:
-#line 574 "engines/director/lingo/lingo-gr.y"
+#line 583 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3067 "engines/director/lingo/lingo-gr.cpp"
+#line 3076 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 579 "engines/director/lingo/lingo-gr.y"
+#line 588 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3073 "engines/director/lingo/lingo-gr.cpp"
+#line 3082 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 582 "engines/director/lingo/lingo-gr.y"
+#line 591 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3079 "engines/director/lingo/lingo-gr.cpp"
+#line 3088 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 583 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3085 "engines/director/lingo/lingo-gr.cpp"
+#line 3094 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 584 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3091 "engines/director/lingo/lingo-gr.cpp"
+#line 3100 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 584 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3097 "engines/director/lingo/lingo-gr.cpp"
+#line 3106 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 585 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3103 "engines/director/lingo/lingo-gr.cpp"
+#line 3112 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 585 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3109 "engines/director/lingo/lingo-gr.cpp"
+#line 3118 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 586 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3115 "engines/director/lingo/lingo-gr.cpp"
+#line 3124 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 586 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3121 "engines/director/lingo/lingo-gr.cpp"
+#line 3130 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 587 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3129 "engines/director/lingo/lingo-gr.cpp"
+#line 3138 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 590 "engines/director/lingo/lingo-gr.y"
+#line 599 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3137 "engines/director/lingo/lingo-gr.cpp"
+#line 3146 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 602 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3143 "engines/director/lingo/lingo-gr.cpp"
+#line 3152 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 603 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3149 "engines/director/lingo/lingo-gr.cpp"
+#line 3158 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 596 "engines/director/lingo/lingo-gr.y"
+#line 605 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3159 "engines/director/lingo/lingo-gr.cpp"
+#line 3168 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 601 "engines/director/lingo/lingo-gr.y"
+#line 610 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3169 "engines/director/lingo/lingo-gr.cpp"
+#line 3178 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 607 "engines/director/lingo/lingo-gr.y"
+#line 616 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3179 "engines/director/lingo/lingo-gr.cpp"
+#line 3188 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 612 "engines/director/lingo/lingo-gr.y"
+#line 621 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3189 "engines/director/lingo/lingo-gr.cpp"
+#line 3198 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 618 "engines/director/lingo/lingo-gr.y"
+#line 627 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3197 "engines/director/lingo/lingo-gr.cpp"
+#line 3206 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 621 "engines/director/lingo/lingo-gr.y"
+#line 630 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3205 "engines/director/lingo/lingo-gr.cpp"
+#line 3214 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 632 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3211 "engines/director/lingo/lingo-gr.cpp"
+#line 3220 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 633 "engines/director/lingo/lingo-gr.y"
+#line 642 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3217 "engines/director/lingo/lingo-gr.cpp"
+#line 3226 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 634 "engines/director/lingo/lingo-gr.y"
+#line 643 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3223 "engines/director/lingo/lingo-gr.cpp"
+#line 3232 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 635 "engines/director/lingo/lingo-gr.y"
+#line 644 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3232 "engines/director/lingo/lingo-gr.cpp"
+#line 3241 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 639 "engines/director/lingo/lingo-gr.y"
+#line 648 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3241 "engines/director/lingo/lingo-gr.cpp"
+#line 3250 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 643 "engines/director/lingo/lingo-gr.y"
+#line 652 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3250 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 651 "engines/director/lingo/lingo-gr.y"
+#line 660 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3259 "engines/director/lingo/lingo-gr.cpp"
+#line 3268 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 655 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3268 "engines/director/lingo/lingo-gr.cpp"
+#line 3277 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 659 "engines/director/lingo/lingo-gr.y"
+#line 668 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3277 "engines/director/lingo/lingo-gr.cpp"
+#line 3286 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 672 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3283 "engines/director/lingo/lingo-gr.cpp"
+#line 3292 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 672 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3292 "engines/director/lingo/lingo-gr.cpp"
+#line 3301 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 693 "engines/director/lingo/lingo-gr.y"
+#line 702 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3298 "engines/director/lingo/lingo-gr.cpp"
+#line 3307 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 693 "engines/director/lingo/lingo-gr.y"
+#line 702 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3304 "engines/director/lingo/lingo-gr.cpp"
+#line 3313 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 694 "engines/director/lingo/lingo-gr.y"
+#line 703 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3314 "engines/director/lingo/lingo-gr.cpp"
+#line 3323 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 699 "engines/director/lingo/lingo-gr.y"
+#line 708 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3320 "engines/director/lingo/lingo-gr.cpp"
+#line 3329 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 700 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3326 "engines/director/lingo/lingo-gr.cpp"
+#line 3335 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 710 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3336 "engines/director/lingo/lingo-gr.cpp"
+#line 3345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 706 "engines/director/lingo/lingo-gr.y"
+#line 715 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3345,70 +3354,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3349 "engines/director/lingo/lingo-gr.cpp"
+#line 3358 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 714 "engines/director/lingo/lingo-gr.y"
+#line 723 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3359 "engines/director/lingo/lingo-gr.cpp"
+#line 3368 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 720 "engines/director/lingo/lingo-gr.y"
+#line 729 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3365 "engines/director/lingo/lingo-gr.cpp"
+#line 3374 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 720 "engines/director/lingo/lingo-gr.y"
+#line 729 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
-#line 3372 "engines/director/lingo/lingo-gr.cpp"
+#line 3381 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 723 "engines/director/lingo/lingo-gr.y"
+#line 732 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3378 "engines/director/lingo/lingo-gr.cpp"
+#line 3387 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 724 "engines/director/lingo/lingo-gr.y"
+#line 733 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3384 "engines/director/lingo/lingo-gr.cpp"
+#line 3393 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 725 "engines/director/lingo/lingo-gr.y"
+#line 734 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3390 "engines/director/lingo/lingo-gr.cpp"
+#line 3399 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 728 "engines/director/lingo/lingo-gr.y"
+#line 737 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3396 "engines/director/lingo/lingo-gr.cpp"
+#line 3405 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 729 "engines/director/lingo/lingo-gr.y"
+#line 738 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3402 "engines/director/lingo/lingo-gr.cpp"
+#line 3411 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 731 "engines/director/lingo/lingo-gr.y"
+#line 740 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3408 "engines/director/lingo/lingo-gr.cpp"
+#line 3417 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 742 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3416,113 +3425,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3420 "engines/director/lingo/lingo-gr.cpp"
+#line 3429 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 741 "engines/director/lingo/lingo-gr.y"
+#line 750 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3426 "engines/director/lingo/lingo-gr.cpp"
+#line 3435 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 742 "engines/director/lingo/lingo-gr.y"
+#line 751 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3432 "engines/director/lingo/lingo-gr.cpp"
+#line 3441 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 752 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3438 "engines/director/lingo/lingo-gr.cpp"
+#line 3447 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 745 "engines/director/lingo/lingo-gr.y"
+#line 754 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3444 "engines/director/lingo/lingo-gr.cpp"
+#line 3453 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 746 "engines/director/lingo/lingo-gr.y"
+#line 755 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3450 "engines/director/lingo/lingo-gr.cpp"
+#line 3459 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 748 "engines/director/lingo/lingo-gr.y"
+#line 757 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3456 "engines/director/lingo/lingo-gr.cpp"
+#line 3465 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 759 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3462 "engines/director/lingo/lingo-gr.cpp"
+#line 3471 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 760 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3468 "engines/director/lingo/lingo-gr.cpp"
+#line 3477 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 752 "engines/director/lingo/lingo-gr.y"
+#line 761 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3474 "engines/director/lingo/lingo-gr.cpp"
+#line 3483 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 753 "engines/director/lingo/lingo-gr.y"
+#line 762 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3480 "engines/director/lingo/lingo-gr.cpp"
+#line 3489 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 755 "engines/director/lingo/lingo-gr.y"
+#line 764 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3486 "engines/director/lingo/lingo-gr.cpp"
+#line 3495 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 756 "engines/director/lingo/lingo-gr.y"
+#line 765 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3492 "engines/director/lingo/lingo-gr.cpp"
+#line 3501 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 758 "engines/director/lingo/lingo-gr.y"
+#line 767 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3498 "engines/director/lingo/lingo-gr.cpp"
+#line 3507 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175:
-#line 759 "engines/director/lingo/lingo-gr.y"
+#line 768 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3504 "engines/director/lingo/lingo-gr.cpp"
+#line 3513 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176:
-#line 761 "engines/director/lingo/lingo-gr.y"
+#line 770 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3513 "engines/director/lingo/lingo-gr.cpp"
+#line 3522 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177:
-#line 765 "engines/director/lingo/lingo-gr.y"
+#line 774 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3522 "engines/director/lingo/lingo-gr.cpp"
+#line 3531 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3526 "engines/director/lingo/lingo-gr.cpp"
+#line 3535 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3721,7 +3730,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 771 "engines/director/lingo/lingo-gr.y"
+#line 780 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index 303bd41d2d..be6b0b5b46 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 129 "engines/director/lingo/lingo-gr.y"
+#line 138 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 97d7e418c6..91aba75d90 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -110,6 +110,15 @@ static void endDef() {
 	g_lingo->_methodVarsStash = nullptr;
 }
 
+static VarType globalCheck() {
+	// If in a definition, assume variables are local unless
+	// they were declared global with `global varname`
+	if (g_lingo->_indef == kStateInDef) {
+		return kVarLocal;
+	}
+	return kVarGlobal;
+}
+
 static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
@@ -195,7 +204,7 @@ programline: /* empty */
 asgn: tPUT expr tINTO ID 		{
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString($ID->c_str());
-		mVar($ID, kVarLocal);
+		mVar($ID, globalCheck());
 		g_lingo->code1(LC::c_assign);
 		$$ = $expr;
 		delete $ID; }
@@ -219,7 +228,7 @@ asgn: tPUT expr tINTO ID 		{
 	| tSET ID tEQ expr			{
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString($ID->c_str());
-		mVar($ID, kVarLocal);
+		mVar($ID, globalCheck());
 		g_lingo->code1(LC::c_assign);
 		$$ = $expr;
 		delete $ID; }
@@ -233,7 +242,7 @@ asgn: tPUT expr tINTO ID 		{
 	| tSET ID tTO expr			{
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString($ID->c_str());
-		mVar($ID, kVarLocal);
+		mVar($ID, globalCheck());
 		g_lingo->code1(LC::c_assign);
 		$$ = $expr;
 		delete $ID; }
@@ -299,7 +308,7 @@ stmt: stmtoneliner
 	| tREPEAT tWITH ID tEQ expr[init]
 				{ g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString($ID->c_str());
-				  mVar($ID, kVarLocal); }
+				  mVar($ID, globalCheck()); }
 			varassign
 				{ g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString($ID->c_str()); }
@@ -330,7 +339,7 @@ stmt: stmtoneliner
 	| tREPEAT tWITH ID tEQ expr[init]
 				{ g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString($ID->c_str());
-				  mVar($ID, kVarLocal); }
+				  mVar($ID, globalCheck()); }
 			varassign
 				{ g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString($ID->c_str()); }
@@ -382,7 +391,7 @@ stmt: stmtoneliner
 				  g_lingo->codeFunc(&getAt, 2);
 				  g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString($ID->c_str());
-				  mVar($ID, kVarLocal);
+				  mVar($ID, globalCheck());
 				  g_lingo->code1(LC::c_assign); }
 			stmtlist tENDREPEAT {
 


Commit: dbeabf0be3124ee91943bec18d17e813d0ab2904
    https://github.com/scummvm/scummvm/commit/dbeabf0be3124ee91943bec18d17e813d0ab2904
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Fix lazy datum printing

Changed paths:
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index d5fdba49a6..f2d5f3ba97 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -690,7 +690,7 @@ Common::String Datum::asString(bool printonly) {
 		warning("Incorrect operation asString() for type: %s", type2str());
 	}
 
-	if (lazy) {
+	if (printonly && lazy) {
 		s += " (lazy)";
 	}
 


Commit: ca9e952d41382a42f51183724b9e005ea493d06e
    https://github.com/scummvm/scummvm/commit/ca9e952d41382a42f51183724b9e005ea493d06e
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement Lingo::push/popContext

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index f2cc7a351d..089fdf664b 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -211,6 +211,49 @@ void LC::c_xpop() {
 	g_lingo->pop();
 }
 
+void Lingo::pushContext(const Symbol *funcSym) {
+	debugC(5, kDebugLingoExec, "Pushing frame %d", g_lingo->_callstack.size() + 1);
+	CFrame *fp = new CFrame;
+
+	fp->retpc = g_lingo->_pc;
+	fp->retscript = g_lingo->_currentScript;
+	fp->retctx = g_lingo->_currentScriptContext;
+	fp->retarchive = g_lingo->_archiveIndex;
+	fp->localvars = g_lingo->_localvars;
+	fp->retMeObj = g_lingo->_currentMeObj;
+	if (funcSym) {
+		fp->sp = *funcSym;
+	}
+
+	g_lingo->_callstack.push_back(fp);
+
+	if (debugChannelSet(5, kDebugLingoExec)) {
+		g_lingo->printCallStack(0);
+	}
+}
+
+void Lingo::popContext() {
+	debugC(5, kDebugLingoExec, "Popping frame %d", g_lingo->_callstack.size());
+	CFrame *fp = g_lingo->_callstack.back();
+	g_lingo->_callstack.pop_back();
+
+	g_lingo->_currentScript = fp->retscript;
+	g_lingo->_currentScriptContext = fp->retctx;
+	g_lingo->_archiveIndex = fp->retarchive;
+	g_lingo->_pc = fp->retpc;
+	g_lingo->_currentMeObj = fp->retMeObj;
+
+	// Restore local variables
+	g_lingo->cleanLocalVars();
+	g_lingo->_localvars = fp->localvars;
+
+	if (debugChannelSet(5, kDebugLingoExec)) {
+		g_lingo->printCallStack(g_lingo->_pc);
+	}
+
+	delete fp;
+}
+
 void LC::c_printtop(void) {
 	Datum d = g_lingo->pop();
 
@@ -1346,15 +1389,7 @@ void LC::call(const Symbol &funcSym, int nargs, Object *target) {
 		g_lingo->push(d);
 	}
 
-	debugC(5, kDebugLingoExec, "Pushing frame %d", g_lingo->_callstack.size() + 1);
-	CFrame *fp = new CFrame;
-
-	fp->retpc = g_lingo->_pc;
-	fp->retscript = g_lingo->_currentScript;
-	fp->retctx = g_lingo->_currentScriptContext;
-	fp->retarchive = g_lingo->_archiveIndex;
-	fp->localvars = g_lingo->_localvars;
-	fp->retMeObj = g_lingo->_currentMeObj;
+	g_lingo->pushContext(&funcSym);
 
 	// Create new set of local variables
 	SymbolHash *localvars = new SymbolHash;
@@ -1403,14 +1438,6 @@ void LC::call(const Symbol &funcSym, int nargs, Object *target) {
 		g_lingo->_currentMeObj = nullptr;
 	}
 
-	fp->sp = funcSym;
-
-	g_lingo->_callstack.push_back(fp);
-
-	if (debugChannelSet(5, kDebugLingoExec)) {
-		g_lingo->printCallStack(0);
-	}
-
 	g_lingo->_currentScript = funcSym.u.defn;
 	if (funcSym.ctx) {
 		g_lingo->_currentScriptContext = funcSym.ctx;
@@ -1427,11 +1454,7 @@ void LC::c_procret() {
 		return;
 	}
 
-	debugC(5, kDebugLingoExec, "Popping frame %d", g_lingo->_callstack.size());
-
 	CFrame *fp = g_lingo->_callstack.back();
-	g_lingo->_callstack.pop_back();
-
 	if (g_lingo->_currentMeObj && g_lingo->_currentMeObj->type == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
 		// Return the newly created object after executing mNew
 		Datum d;
@@ -1440,22 +1463,7 @@ void LC::c_procret() {
 		g_lingo->push(d);
 	}
 
-	g_lingo->_currentScript = fp->retscript;
-	g_lingo->_currentScriptContext = fp->retctx;
-	g_lingo->_archiveIndex = fp->retarchive;
-	g_lingo->_pc = fp->retpc;
-	g_lingo->_currentMeObj = fp->retMeObj;
-
-	if (debugChannelSet(5, kDebugLingoExec)) {
-		g_lingo->printCallStack(g_lingo->_pc);
-	}
-
-	g_lingo->cleanLocalVars();
-
-	// Restore local variables
-	g_lingo->_localvars = fp->localvars;
-
-	delete fp;
+	g_lingo->popContext();
 
 	if (g_lingo->_callstack.size() == 0) {
 		debugC(5, kDebugLingoExec, "Call stack empty, returning");
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 841e266ce7..a9c86f454d 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -364,7 +364,7 @@ public:
 
 public:
 	void execute(uint pc);
-	void pushContext();
+	void pushContext(const Symbol *funcSym = nullptr);
 	void popContext();
 	void cleanLocalVars();
 	Symbol define(Common::String &s, int nargs, ScriptData *code, Common::Array<Common::String> *argNames = nullptr, Common::Array<Common::String> *varNames = nullptr, Object *obj = nullptr);


Commit: 7549b819bb23ce0a021c6fdad06ecd31a0fe556f
    https://github.com/scummvm/scummvm/commit/7549b819bb23ce0a021c6fdad06ecd31a0fe556f
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement primary event handlers

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 089fdf664b..193c7a665a 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1224,6 +1224,8 @@ void LC::c_whencode() {
 	// the following when events are supported by D3
 	if (eventname.equalsIgnoreCase("keyDown")) {
 		g_lingo->setTheEntity(kTheKeyDownScript, nullId, kTheNOField, code);
+	} else if (eventname.equalsIgnoreCase("keyUp")) {
+		g_lingo->setTheEntity(kTheKeyUpScript, nullId, kTheNOField, code);
 	} else if (eventname.equalsIgnoreCase("mouseDown")) {
 		g_lingo->setTheEntity(kTheMouseDownScript, nullId, kTheNOField, code);
 	} else if (eventname.equalsIgnoreCase("mouseUp")) {
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 6f30e6327c..c30580a486 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -98,6 +98,15 @@ int Lingo::getEventCount() {
 	return _eventQueue.size();
 }
 
+void Lingo::setPrimaryEventHandler(LEvent event, const Common::String &code) {
+	debugC(3, kDebugLingoExec, "setting primary event handler (%s)", _eventHandlerTypes[event]);
+	_archives[_archiveIndex].primaryEventHandlers[event] = code;
+	pushContext();
+	g_lingo->_localvars = new SymbolHash;
+	addCode(code.c_str(), kGlobalScript, event);
+	popContext();
+}
+
 void Lingo::primaryEventHandler(LEvent event) {
 	/* When an event occurs the message [...] is first sent to a
 	 * primary event handler: [... if exists it is executed] and the
@@ -105,14 +114,14 @@ void Lingo::primaryEventHandler(LEvent event) {
 	 * the message by including the dontPassEventCommand in the script
 	 * [D4 docs page 77]
 	 */
-	debugC(3, kDebugLingoExec, "STUB: primary event handler (%s) not implemented", _eventHandlerTypes[event]);
+	debugC(3, kDebugLingoExec, "calling primary event handler (%s)", _eventHandlerTypes[event]);
 	switch (event) {
 	case kEventMouseDown:
 	case kEventMouseUp:
 	case kEventKeyUp:
 	case kEventKeyDown:
 	case kEventTimeout:
-		// TODO
+		executeScript(kGlobalScript, event, 0);
 		break;
 	default:
 		/* N.B.: No primary event handlers for events other than
@@ -122,13 +131,6 @@ void Lingo::primaryEventHandler(LEvent event) {
 		 */
 		warning("primaryEventHandler() on event other than mouseDown, mouseUp, keyUp, keyDown, timeout");
 	}
-#ifdef DEBUG_DONTPASSEVENT
-	// #define DEBUG_DONTPASSEVENT to simulate raising of the dontPassEvent flag
-	_dontPassEvent = true;
-	debugC(3, kDebugLingoExec, "STUB: primaryEventHandler raising dontPassEvent");
-#else
-	debugC(3, kDebugLingoExec, "STUB: primaryEventHandler not raising dontPassEvent");
-#endif
 }
 
 void Lingo::registerInputEvent(LEvent event) {
@@ -183,10 +185,6 @@ void Lingo::registerInputEvent(LEvent event) {
 			_eventQueue.push(LingoEvent(event, kSpriteScript, sprite->_castId + score->_castIDoffset));
 		}
 	}
-	if (event == kEventKeyDown) {
-		// TODO: is the above condition necessary or useful?
-		_eventQueue.push(LingoEvent(event, kGlobalScript, 0));
-	}
 
 	runMovieScript(event);
 }
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 123d955666..806f926bc8 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -373,6 +373,20 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.type = INT;
 		d.u.i = _vm->_keyCode;
 		break;
+	case kTheKeyDownScript:
+		d.type = STRING;
+		if (_archives[_archiveIndex].primaryEventHandlers.contains(kEventKeyDown))
+			d.u.s = new Common::String(_archives[_archiveIndex].primaryEventHandlers[kEventKeyDown]);
+		else
+			d.u.s = new Common::String();
+		break;
+	case kTheKeyUpScript:
+		d.type = STRING;
+		if (_archives[_archiveIndex].primaryEventHandlers.contains(kEventKeyUp))
+			d.u.s = new Common::String(_archives[_archiveIndex].primaryEventHandlers[kEventKeyUp]);
+		else
+			d.u.s = new Common::String();
+		break;
 	case kTheLastClick:
 		d.type = INT;
 		d.u.i = _vm->getMacTicks() - _vm->getCurrentScore()->_lastClickTime;
@@ -455,6 +469,13 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.type = INT;
 		d.u.i = g_system->getEventManager()->getButtonState() & (1 << Common::MOUSE_BUTTON_LEFT | 1 << Common::MOUSE_BUTTON_RIGHT) ? 1 : 0;
 		break;
+	case kTheMouseDownScript:
+		d.type = STRING;
+		if (_archives[_archiveIndex].primaryEventHandlers.contains(kEventMouseDown))
+			d.u.s = new Common::String(_archives[_archiveIndex].primaryEventHandlers[kEventMouseDown]);
+		else
+			d.u.s = new Common::String();
+		break;
 	case kTheMouseH:
 		d.type = INT;
 		d.u.i = g_system->getEventManager()->getMousePos().x;
@@ -467,6 +488,13 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.type = INT;
 		d.u.i = g_system->getEventManager()->getButtonState() & (1 << Common::MOUSE_BUTTON_LEFT | 1 << Common::MOUSE_BUTTON_RIGHT) ? 0 : 1;
 		break;
+	case kTheMouseUpScript:
+		d.type = STRING;
+		if (_archives[_archiveIndex].primaryEventHandlers.contains(kEventMouseUp))
+			d.u.s = new Common::String(_archives[_archiveIndex].primaryEventHandlers[kEventMouseUp]);
+		else
+			d.u.s = new Common::String();
+		break;
 	case kThePerFrameHook:
 		d = _perFrameHook;
 		break;
@@ -524,6 +552,13 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.type = INT;
 		d.u.i = _vm->getMacTicks() - _vm->getCurrentScore()->_lastTimerReset;
 		break;
+	case kTheTimeoutScript:
+		d.type = STRING;
+		if (_archives[_archiveIndex].primaryEventHandlers.contains(kEventTimeout))
+			d.u.s = new Common::String(_archives[_archiveIndex].primaryEventHandlers[kEventTimeout]);
+		else
+			d.u.s = new Common::String();
+		break;
 	default:
 		warning("Lingo::getTheEntity(): Unprocessed getting field \"%s\" of entity %s", field2str(field), entity2str(entity));
 		break;
@@ -552,6 +587,18 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		_floatPrecision = MAX(0, MIN(_floatPrecision, 19)); // 0 to 19
 		_floatPrecisionFormat = Common::String::format("%%.%df", _floatPrecision);
 		break;
+	case kTheKeyDownScript:
+		setPrimaryEventHandler(kEventKeyDown, d.asString());
+		break;
+	case kTheKeyUpScript:
+		setPrimaryEventHandler(kEventKeyUp, d.asString());
+		break;
+	case kTheMouseDownScript:
+		setPrimaryEventHandler(kEventMouseDown, d.asString());
+		break;
+	case kTheMouseUpScript:
+		setPrimaryEventHandler(kEventMouseUp, d.asString());
+		break;
 	case kThePerFrameHook:
 		_perFrameHook = d;
 		break;
@@ -575,6 +622,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 	case kTheSprite:
 		setTheSprite(id, field, d);
 		break;
+	case kTheTimeoutScript:
+		setPrimaryEventHandler(kEventTimeout, d.asString());
+		break;
 	default:
 		warning("Lingo::setTheEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
 	}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a9c86f454d..a4057f9e50 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -299,6 +299,7 @@ struct LingoArchive {
 	ScriptContextHash scriptContexts[kMaxScriptType + 1];
 	Common::Array<Common::String> names;
 	Common::HashMap<uint32, Symbol> eventHandlers;
+	Common::HashMap<uint32, Common::String> primaryEventHandlers;
 	SymbolHash functionHandlers;
 };
 
@@ -341,6 +342,7 @@ private:
 	// lingo-events.cpp
 private:
 	void initEventHandlerTypes();
+	void setPrimaryEventHandler(LEvent event, Common::String &code);
 	void primaryEventHandler(LEvent event);
 	void registerInputEvent(LEvent event);
 	void registerFrameEvent(LEvent event);


Commit: 759c53c8684ad07e1d5620db99c8fba477045b06
    https://github.com/scummvm/scummvm/commit/759c53c8684ad07e1d5620db99c8fba477045b06
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Call perFrameHook with arguments

Changed paths:
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/score.cpp
    engines/director/transitions.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index f2d5f3ba97..4fe1106f97 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -831,18 +831,15 @@ void Lingo::executeImmediateScripts(Frame *frame) {
 	}
 }
 
-void Lingo::executePerFrameHook() {
-	// TODO: Call with arguments
+void Lingo::executePerFrameHook(int frame, int subframe) {
 	if (_perFrameHook.type == OBJECT) {
 		Symbol method = _perFrameHook.u.obj->getMethod("mAtFrame");
 		if (method.type != VOID) {
-			_localvars = new SymbolHash;
-
-			debugC(1, kDebugLingoExec, "Executing mAtFrame on perFrameHook : %s", _perFrameHook.u.obj->name->c_str());
-			LC::call(method, 0, _perFrameHook.u.obj);
+			debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>(mAtFrame, %d, %d)", _perFrameHook.asString(true).c_str(), frame, subframe);
+			push(Datum(frame));
+			push(Datum(subframe));
+			LC::call(method, 2, _perFrameHook.u.obj);
 			execute(_pc);
-
-			cleanLocalVars();
 		}
 	}
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a4057f9e50..ce37fb7f89 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -551,7 +551,7 @@ public:
 
 public:
 	void executeImmediateScripts(Frame *frame);
-	void executePerFrameHook();
+	void executePerFrameHook(int frame, int subframe);
 };
 
 extern Lingo *g_lingo;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 4b61f25f78..197b91c521 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -380,6 +380,14 @@ void Score::update() {
 
 	// For previous frame
 	if (_currentFrame > 0) {
+		// TODO: Confirm when the perFrameHook is called if
+		// there's no transition.
+		// If there is a transition, the perFrameHook is called
+		// after each transition subframe instead.
+		if (_frames[_currentFrame]->_transType == 0) {
+			_lingo->executePerFrameHook(_currentFrame, 0);
+		}
+
 		// When Lingo::func_goto* is called, _nextFrame is set
 		// and _skipFrameAdvance is set to true.
 		// However, the exitFrame event can overwrite the value
@@ -430,7 +438,6 @@ void Score::update() {
 	// _surface->copyFrom(*_trailSurface);
 
 	_lingo->executeImmediateScripts(_frames[_currentFrame]);
-	_lingo->executePerFrameHook();
 
 	if (_vm->getVersion() >= 6) {
 		_lingo->processEvent(kEventBeginSprite);
@@ -518,9 +525,10 @@ void Score::renderFrame(uint16 frameId, bool forceUpdate, bool updateStageOnly)
 
 		_vm->_wm->draw();
 
-		if (currentFrame->_transType != 0)
+		if (currentFrame->_transType != 0) {
 			// TODO Handle changing area case
 			playTransition(currentFrame->_transDuration, currentFrame->_transArea, currentFrame->_transChunkSize, currentFrame->_transType);
+		}
 
 		if (currentFrame->_sound1 != 0 || currentFrame->_sound2 != 0) {
 			playSoundChannel(frameId);
diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index b90163219a..0d5906e334 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -30,6 +30,7 @@
 #include "director/frame.h"
 #include "director/score.h"
 #include "director/util.h"
+#include "director/lingo/lingo.h"
 
 namespace Director {
 
@@ -131,6 +132,8 @@ struct {
 };
 
 void Score::playTransition(uint16 transDuration, uint8 transArea, uint8 transChunkSize, TransitionType transType) {
+	// Play a transition and return the number of subframes rendered
+
 	TransParams t;
 
 	t.type = transType;
@@ -437,6 +440,8 @@ void Score::playTransition(uint16 transDuration, uint8 transArea, uint8 transChu
 		}
 
 		g_system->updateScreen();
+
+		g_lingo->executePerFrameHook(_currentFrame, i);
 	}
 }
 
@@ -568,7 +573,7 @@ void Score::dissolveTrans(TransParams &t, Common::Rect &clipRect) {
 
 	Common::Rect r(MAX(1, t.xStepSize), t.yStepSize);
 
-	while (t.steps) {
+	for (int i = 0; i < t.steps; i++) {
 		uint32 pixPerStep = pixPerStepInit;
 		do {
 			uint32 x = rnd >> vShift;
@@ -611,12 +616,12 @@ void Score::dissolveTrans(TransParams &t, Common::Rect &clipRect) {
 		g_system->copyRectToScreen(_backSurface->getPixels(), _backSurface->pitch, 0, 0, realw, realh);
 		g_system->updateScreen();
 
+		g_lingo->executePerFrameHook(_currentFrame, i + 1);
+
 		if (processQuitEvent(true))
 			break;
 
 		g_system->delayMillis(t.stepDuration);
-
-		t.steps--;
 	}
 }
 
@@ -719,6 +724,8 @@ void Score::dissolvePatternsTrans(TransParams &t, Common::Rect &clipRect) {
 		g_system->copyRectToScreen(_backSurface->getPixels(), _backSurface->pitch, 0, 0, w, h);
 		g_system->updateScreen();
 
+		g_lingo->executePerFrameHook(_currentFrame, i + 1);
+
 		if (processQuitEvent(true))
 			break;
 
@@ -889,6 +896,8 @@ void Score::transMultiPass(TransParams &t, Common::Rect &clipRect) {
 
 		g_system->updateScreen();
 
+		g_lingo->executePerFrameHook(_currentFrame, i);
+
 		g_system->delayMillis(t.stepDuration);
 		if (processQuitEvent(true))
 			break;
@@ -935,6 +944,8 @@ void Score::transZoom(TransParams &t, Common::Rect &clipRect) {
 		g_system->copyRectToScreen(_backSurface->getPixels(), _backSurface->pitch, 0, 0, w, h);
 		g_system->updateScreen();
 
+		g_lingo->executePerFrameHook(_currentFrame, i);
+
 		g_system->delayMillis(t.stepDuration);
 		if (processQuitEvent(true))
 			break;


Commit: be4c440128e85b84f04e515627e9ccd8e2c9ab7c
    https://github.com/scummvm/scummvm/commit/be4c440128e85b84f04e515627e9ccd8e2c9ab7c
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Remove legacy me code

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index f5e8c7c544..1196b6e4dd 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -244,7 +244,6 @@ static struct BuiltinProto {
 	// References
 	{ "cast",			LB::b_cast,			1, 1, false, 4, RBLTIN },	//			D4 f
 	{ "field",			LB::b_field,		1, 1, false, 3, RBLTIN },	//		D3 f
-//	{ "me",				LB::b_me,			-1,0, false, 3, FBLTIN },	//		D3				// works as normal ID, see c_varpush
 	{ "script",			LB::b_script,		1, 1, false, 4, RBLTIN },	//			D4 f
 	{ "window",			LB::b_window,		1, 1, false, 4, RBLTIN },	//			D4 f
 	// Chunk operations
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index b0dd6c01a5..7ff1767c4a 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -381,31 +381,6 @@ int Lingo::codeFunc(Common::String *s, int numpar) {
 	return ret;
 }
 
-// int Lingo::codeMe(Common::String *method, int numpar) {
-// 	// Check if need to encode reference to the factory
-// 	if (method == nullptr) {
-// 		int ret = g_lingo->code1(LC::c_factory);
-// 		g_lingo->codeString(g_lingo->_currentFactory->name->c_str());
-
-// 		return ret;
-// 	}
-
-// 	int ret = g_lingo->code1(LC::c_call);
-
-// 	Common::String m(g_lingo->_currentFactory->name);
-
-// 	m += '-';
-// 	m += *method;
-
-// 	g_lingo->codeString(m.c_str());
-
-// 	inst num = 0;
-// 	WRITE_UINT32(&num, numpar);
-// 	g_lingo->code1(num);
-
-// 	return ret;
-// }
-
 void Lingo::codeLabel(int label) {
 	_labelstack.push_back(label);
 	debugC(4, kDebugLingoCompile, "codeLabel: Added label %d", label);
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 68d12e5628..88bd048f70 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -120,7 +120,6 @@ static void startDef() {
 static void endDef() {
 	g_lingo->clearArgStack();
 	inNone();
-	g_lingo->_ignoreMe = false;
 
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
@@ -151,7 +150,7 @@ static void mVar(Common::String *s, VarType type) {
 }
 
 
-#line 155 "engines/director/lingo/lingo-gr.cpp"
+#line 154 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -288,7 +287,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 138 "engines/director/lingo/lingo-gr.y"
+#line 137 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -308,7 +307,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 312 "engines/director/lingo/lingo-gr.cpp"
+#line 311 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -862,24 +861,24 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   197,   197,   198,   200,   201,   202,   204,   211,   215,
-     226,   227,   228,   235,   242,   249,   256,   262,   269,   280,
-     287,   288,   289,   291,   292,   297,   309,   313,   316,   308,
-     340,   344,   347,   339,   373,   380,   386,   372,   414,   416,
-     419,   420,   422,   424,   431,   439,   440,   442,   448,   452,
-     456,   460,   463,   465,   466,   467,   469,   472,   475,   479,
-     483,   487,   495,   501,   502,   503,   514,   515,   516,   519,
-     522,   528,   528,   533,   536,   539,   544,   550,   551,   552,
-     553,   554,   555,   556,   557,   558,   559,   560,   561,   562,
-     563,   564,   565,   566,   567,   568,   569,   570,   571,   572,
-     574,   575,   576,   577,   578,   579,   580,   581,   583,   586,
-     588,   589,   590,   591,   592,   593,   593,   594,   594,   595,
-     595,   596,   599,   602,   603,   605,   610,   616,   621,   627,
-     630,   641,   642,   643,   644,   648,   652,   657,   658,   660,
-     664,   668,   672,   672,   702,   702,   702,   708,   709,   709,
-     715,   723,   729,   729,   732,   733,   734,   736,   737,   738,
-     740,   742,   750,   751,   752,   754,   755,   757,   759,   760,
-     761,   762,   764,   765,   767,   768,   770,   774
+       0,   196,   196,   197,   199,   200,   201,   203,   210,   214,
+     225,   226,   227,   234,   241,   248,   255,   261,   268,   279,
+     286,   287,   288,   290,   291,   296,   308,   312,   315,   307,
+     339,   343,   346,   338,   372,   379,   385,   371,   413,   415,
+     418,   419,   421,   423,   430,   438,   439,   441,   447,   451,
+     455,   459,   462,   464,   465,   466,   468,   471,   474,   478,
+     482,   486,   494,   500,   501,   502,   513,   514,   515,   518,
+     521,   527,   527,   532,   535,   538,   543,   549,   550,   551,
+     552,   553,   554,   555,   556,   557,   558,   559,   560,   561,
+     562,   563,   564,   565,   566,   567,   568,   569,   570,   571,
+     573,   574,   575,   576,   577,   578,   579,   580,   582,   585,
+     587,   588,   589,   590,   591,   592,   592,   593,   593,   594,
+     594,   595,   598,   601,   602,   604,   609,   615,   620,   626,
+     629,   640,   641,   642,   643,   647,   651,   656,   657,   659,
+     663,   667,   671,   671,   701,   701,   701,   707,   708,   708,
+     714,   722,   728,   728,   731,   732,   733,   735,   736,   737,
+     739,   741,   749,   750,   751,   753,   754,   756,   758,   759,
+     760,   761,   763,   764,   766,   767,   769,   773
 };
 #endif
 
@@ -1950,81 +1949,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1956 "engines/director/lingo/lingo-gr.cpp"
+#line 1955 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1962 "engines/director/lingo/lingo-gr.cpp"
+#line 1961 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1968 "engines/director/lingo/lingo-gr.cpp"
+#line 1967 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1974 "engines/director/lingo/lingo-gr.cpp"
+#line 1973 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1980 "engines/director/lingo/lingo-gr.cpp"
+#line 1979 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1986 "engines/director/lingo/lingo-gr.cpp"
+#line 1985 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1992 "engines/director/lingo/lingo-gr.cpp"
+#line 1991 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1998 "engines/director/lingo/lingo-gr.cpp"
+#line 1997 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2004 "engines/director/lingo/lingo-gr.cpp"
+#line 2003 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2010 "engines/director/lingo/lingo-gr.cpp"
+#line 2009 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2016 "engines/director/lingo/lingo-gr.cpp"
+#line 2015 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 193 "engines/director/lingo/lingo-gr.y"
+#line 192 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2022 "engines/director/lingo/lingo-gr.cpp"
+#line 2021 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 148: /* on  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 191 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2028 "engines/director/lingo/lingo-gr.cpp"
+#line 2027 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2303,7 +2302,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 204 "engines/director/lingo/lingo-gr.y"
+#line 203 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2311,19 +2310,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2315 "engines/director/lingo/lingo-gr.cpp"
+#line 2314 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 211 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2323 "engines/director/lingo/lingo-gr.cpp"
+#line 2322 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 215 "engines/director/lingo/lingo-gr.y"
+#line 214 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2335,23 +2334,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2339 "engines/director/lingo/lingo-gr.cpp"
+#line 2338 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 226 "engines/director/lingo/lingo-gr.y"
+#line 225 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2345 "engines/director/lingo/lingo-gr.cpp"
+#line 2344 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 227 "engines/director/lingo/lingo-gr.y"
+#line 226 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2351 "engines/director/lingo/lingo-gr.cpp"
+#line 2350 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 228 "engines/director/lingo/lingo-gr.y"
+#line 227 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2359,11 +2358,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2363 "engines/director/lingo/lingo-gr.cpp"
+#line 2362 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 235 "engines/director/lingo/lingo-gr.y"
+#line 234 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2371,11 +2370,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2375 "engines/director/lingo/lingo-gr.cpp"
+#line 2374 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 242 "engines/director/lingo/lingo-gr.y"
+#line 241 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2383,11 +2382,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2387 "engines/director/lingo/lingo-gr.cpp"
+#line 2386 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 249 "engines/director/lingo/lingo-gr.y"
+#line 248 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2395,33 +2394,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2399 "engines/director/lingo/lingo-gr.cpp"
+#line 2398 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 256 "engines/director/lingo/lingo-gr.y"
+#line 255 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2410 "engines/director/lingo/lingo-gr.cpp"
+#line 2409 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 262 "engines/director/lingo/lingo-gr.y"
+#line 261 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2421 "engines/director/lingo/lingo-gr.cpp"
+#line 2420 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 269 "engines/director/lingo/lingo-gr.y"
+#line 268 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2433,54 +2432,54 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2437 "engines/director/lingo/lingo-gr.cpp"
+#line 2436 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 280 "engines/director/lingo/lingo-gr.y"
+#line 279 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2448 "engines/director/lingo/lingo-gr.cpp"
+#line 2447 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 297 "engines/director/lingo/lingo-gr.y"
+#line 296 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-5].code) - (yyvsp[-1].code) + 1);
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2459 "engines/director/lingo/lingo-gr.cpp"
+#line 2458 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 309 "engines/director/lingo/lingo-gr.y"
+#line 308 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2467 "engines/director/lingo/lingo-gr.cpp"
+#line 2466 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 313 "engines/director/lingo/lingo-gr.y"
+#line 312 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2474 "engines/director/lingo/lingo-gr.cpp"
+#line 2473 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 316 "engines/director/lingo/lingo-gr.y"
+#line 315 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2480 "engines/director/lingo/lingo-gr.cpp"
+#line 2479 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 316 "engines/director/lingo/lingo-gr.y"
+#line 315 "engines/director/lingo/lingo-gr.y"
                                                                                           {
 
 		g_lingo->code1(LC::c_eval);
@@ -2499,32 +2498,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2503 "engines/director/lingo/lingo-gr.cpp"
+#line 2502 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 340 "engines/director/lingo/lingo-gr.y"
+#line 339 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2511 "engines/director/lingo/lingo-gr.cpp"
+#line 2510 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 344 "engines/director/lingo/lingo-gr.y"
+#line 343 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2518 "engines/director/lingo/lingo-gr.cpp"
+#line 2517 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 347 "engines/director/lingo/lingo-gr.y"
+#line 346 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2524 "engines/director/lingo/lingo-gr.cpp"
+#line 2523 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 348 "engines/director/lingo/lingo-gr.y"
+#line 347 "engines/director/lingo/lingo-gr.y"
                                                     {
 
 		g_lingo->code1(LC::c_eval);
@@ -2543,32 +2542,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2547 "engines/director/lingo/lingo-gr.cpp"
+#line 2546 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 373 "engines/director/lingo/lingo-gr.y"
+#line 372 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2558 "engines/director/lingo/lingo-gr.cpp"
+#line 2557 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 380 "engines/director/lingo/lingo-gr.y"
+#line 379 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2568 "engines/director/lingo/lingo-gr.cpp"
+#line 2567 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 386 "engines/director/lingo/lingo-gr.y"
+#line 385 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2579,11 +2578,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), globalCheck());
 				  g_lingo->code1(LC::c_assign); }
-#line 2583 "engines/director/lingo/lingo-gr.cpp"
+#line 2582 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 396 "engines/director/lingo/lingo-gr.y"
+#line 395 "engines/director/lingo/lingo-gr.y"
                                             {
 
 		g_lingo->code1(LC::c_intpush);
@@ -2601,44 +2600,44 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2605 "engines/director/lingo/lingo-gr.cpp"
+#line 2604 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 414 "engines/director/lingo/lingo-gr.y"
+#line 413 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2612 "engines/director/lingo/lingo-gr.cpp"
+#line 2611 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 416 "engines/director/lingo/lingo-gr.y"
+#line 415 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2620 "engines/director/lingo/lingo-gr.cpp"
+#line 2619 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 419 "engines/director/lingo/lingo-gr.y"
+#line 418 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2626 "engines/director/lingo/lingo-gr.cpp"
+#line 2625 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 420 "engines/director/lingo/lingo-gr.y"
+#line 419 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2632 "engines/director/lingo/lingo-gr.cpp"
+#line 2631 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 422 "engines/director/lingo/lingo-gr.y"
+#line 421 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2638 "engines/director/lingo/lingo-gr.cpp"
+#line 2637 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 424 "engines/director/lingo/lingo-gr.y"
+#line 423 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2646,11 +2645,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2650 "engines/director/lingo/lingo-gr.cpp"
+#line 2649 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 431 "engines/director/lingo/lingo-gr.y"
+#line 430 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2658,107 +2657,107 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2662 "engines/director/lingo/lingo-gr.cpp"
+#line 2661 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 442 "engines/director/lingo/lingo-gr.y"
+#line 441 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2672 "engines/director/lingo/lingo-gr.cpp"
+#line 2671 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 448 "engines/director/lingo/lingo-gr.y"
+#line 447 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2680 "engines/director/lingo/lingo-gr.cpp"
+#line 2679 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 452 "engines/director/lingo/lingo-gr.y"
+#line 451 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2688 "engines/director/lingo/lingo-gr.cpp"
+#line 2687 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 456 "engines/director/lingo/lingo-gr.y"
+#line 455 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2696 "engines/director/lingo/lingo-gr.cpp"
+#line 2695 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 460 "engines/director/lingo/lingo-gr.y"
+#line 459 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2703 "engines/director/lingo/lingo-gr.cpp"
+#line 2702 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 463 "engines/director/lingo/lingo-gr.y"
+#line 462 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2709 "engines/director/lingo/lingo-gr.cpp"
+#line 2708 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 465 "engines/director/lingo/lingo-gr.y"
+#line 464 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2715 "engines/director/lingo/lingo-gr.cpp"
+#line 2714 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 469 "engines/director/lingo/lingo-gr.y"
+#line 468 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2723 "engines/director/lingo/lingo-gr.cpp"
+#line 2722 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 472 "engines/director/lingo/lingo-gr.y"
+#line 471 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2731 "engines/director/lingo/lingo-gr.cpp"
+#line 2730 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 475 "engines/director/lingo/lingo-gr.y"
+#line 474 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2740 "engines/director/lingo/lingo-gr.cpp"
+#line 2739 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 479 "engines/director/lingo/lingo-gr.y"
+#line 478 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2749 "engines/director/lingo/lingo-gr.cpp"
+#line 2748 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 483 "engines/director/lingo/lingo-gr.y"
+#line 482 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2758 "engines/director/lingo/lingo-gr.cpp"
+#line 2757 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 487 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2767,28 +2766,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2771 "engines/director/lingo/lingo-gr.cpp"
+#line 2770 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2782 "engines/director/lingo/lingo-gr.cpp"
+#line 2781 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 500 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2788 "engines/director/lingo/lingo-gr.cpp"
+#line 2787 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 503 "engines/director/lingo/lingo-gr.y"
+#line 502 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2799,553 +2798,553 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2803 "engines/director/lingo/lingo-gr.cpp"
+#line 2802 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 514 "engines/director/lingo/lingo-gr.y"
+#line 513 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2809 "engines/director/lingo/lingo-gr.cpp"
+#line 2808 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 516 "engines/director/lingo/lingo-gr.y"
+#line 515 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2817 "engines/director/lingo/lingo-gr.cpp"
+#line 2816 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 519 "engines/director/lingo/lingo-gr.y"
+#line 518 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2825 "engines/director/lingo/lingo-gr.cpp"
+#line 2824 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 522 "engines/director/lingo/lingo-gr.y"
+#line 521 "engines/director/lingo/lingo-gr.y"
                                       {
 			g_lingo->code1(LC::c_lazyeval);
 			g_lingo->codeString((yyvsp[-1].s)->c_str());
 			g_lingo->codeFunc((yyvsp[-3].s), 1);
 			delete (yyvsp[-3].s);
 			delete (yyvsp[-1].s); }
-#line 2836 "engines/director/lingo/lingo-gr.cpp"
+#line 2835 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 528 "engines/director/lingo/lingo-gr.y"
+#line 527 "engines/director/lingo/lingo-gr.y"
                                       { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
-#line 2842 "engines/director/lingo/lingo-gr.cpp"
+#line 2841 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 529 "engines/director/lingo/lingo-gr.y"
+#line 528 "engines/director/lingo/lingo-gr.y"
                                                     {
 			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
 			delete (yyvsp[-6].s);
 			delete (yyvsp[-4].s); }
-#line 2851 "engines/director/lingo/lingo-gr.cpp"
+#line 2850 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 533 "engines/director/lingo/lingo-gr.y"
+#line 532 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2859 "engines/director/lingo/lingo-gr.cpp"
+#line 2858 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 535 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2867 "engines/director/lingo/lingo-gr.cpp"
+#line 2866 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 539 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2877 "engines/director/lingo/lingo-gr.cpp"
+#line 2876 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 543 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2888 "engines/director/lingo/lingo-gr.cpp"
+#line 2887 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 551 "engines/director/lingo/lingo-gr.y"
+#line 550 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2894 "engines/director/lingo/lingo-gr.cpp"
+#line 2893 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 552 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2900 "engines/director/lingo/lingo-gr.cpp"
+#line 2899 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2906 "engines/director/lingo/lingo-gr.cpp"
+#line 2905 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 554 "engines/director/lingo/lingo-gr.y"
+#line 553 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2912 "engines/director/lingo/lingo-gr.cpp"
+#line 2911 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 555 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2918 "engines/director/lingo/lingo-gr.cpp"
+#line 2917 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2924 "engines/director/lingo/lingo-gr.cpp"
+#line 2923 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2930 "engines/director/lingo/lingo-gr.cpp"
+#line 2929 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2936 "engines/director/lingo/lingo-gr.cpp"
+#line 2935 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 558 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2942 "engines/director/lingo/lingo-gr.cpp"
+#line 2941 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2948 "engines/director/lingo/lingo-gr.cpp"
+#line 2947 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 560 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2954 "engines/director/lingo/lingo-gr.cpp"
+#line 2953 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 562 "engines/director/lingo/lingo-gr.y"
+#line 561 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2960 "engines/director/lingo/lingo-gr.cpp"
+#line 2959 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 563 "engines/director/lingo/lingo-gr.y"
+#line 562 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2966 "engines/director/lingo/lingo-gr.cpp"
+#line 2965 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2972 "engines/director/lingo/lingo-gr.cpp"
+#line 2971 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 565 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2978 "engines/director/lingo/lingo-gr.cpp"
+#line 2977 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2984 "engines/director/lingo/lingo-gr.cpp"
+#line 2983 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2990 "engines/director/lingo/lingo-gr.cpp"
+#line 2989 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 567 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2996 "engines/director/lingo/lingo-gr.cpp"
+#line 2995 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 569 "engines/director/lingo/lingo-gr.y"
+#line 568 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 3002 "engines/director/lingo/lingo-gr.cpp"
+#line 3001 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 569 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 3008 "engines/director/lingo/lingo-gr.cpp"
+#line 3007 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 3014 "engines/director/lingo/lingo-gr.cpp"
+#line 3013 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 572 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 3020 "engines/director/lingo/lingo-gr.cpp"
+#line 3019 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 574 "engines/director/lingo/lingo-gr.y"
+#line 573 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 3026 "engines/director/lingo/lingo-gr.cpp"
+#line 3025 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 3032 "engines/director/lingo/lingo-gr.cpp"
+#line 3031 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 576 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 3038 "engines/director/lingo/lingo-gr.cpp"
+#line 3037 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 577 "engines/director/lingo/lingo-gr.y"
+#line 576 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3044 "engines/director/lingo/lingo-gr.cpp"
+#line 3043 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 578 "engines/director/lingo/lingo-gr.y"
+#line 577 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3050 "engines/director/lingo/lingo-gr.cpp"
+#line 3049 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 579 "engines/director/lingo/lingo-gr.y"
+#line 578 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3056 "engines/director/lingo/lingo-gr.cpp"
+#line 3055 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 580 "engines/director/lingo/lingo-gr.y"
+#line 579 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3062 "engines/director/lingo/lingo-gr.cpp"
+#line 3061 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 581 "engines/director/lingo/lingo-gr.y"
+#line 580 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3068 "engines/director/lingo/lingo-gr.cpp"
+#line 3067 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 108:
-#line 583 "engines/director/lingo/lingo-gr.y"
+#line 582 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3076 "engines/director/lingo/lingo-gr.cpp"
+#line 3075 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 588 "engines/director/lingo/lingo-gr.y"
+#line 587 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3082 "engines/director/lingo/lingo-gr.cpp"
+#line 3081 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 591 "engines/director/lingo/lingo-gr.y"
+#line 590 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3088 "engines/director/lingo/lingo-gr.cpp"
+#line 3087 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 591 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3094 "engines/director/lingo/lingo-gr.cpp"
+#line 3093 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3100 "engines/director/lingo/lingo-gr.cpp"
+#line 3099 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3106 "engines/director/lingo/lingo-gr.cpp"
+#line 3105 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3112 "engines/director/lingo/lingo-gr.cpp"
+#line 3111 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3118 "engines/director/lingo/lingo-gr.cpp"
+#line 3117 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 595 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3124 "engines/director/lingo/lingo-gr.cpp"
+#line 3123 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 595 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3130 "engines/director/lingo/lingo-gr.cpp"
+#line 3129 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 596 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3138 "engines/director/lingo/lingo-gr.cpp"
+#line 3137 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 599 "engines/director/lingo/lingo-gr.y"
+#line 598 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3146 "engines/director/lingo/lingo-gr.cpp"
+#line 3145 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 601 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3152 "engines/director/lingo/lingo-gr.cpp"
+#line 3151 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 603 "engines/director/lingo/lingo-gr.y"
+#line 602 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3158 "engines/director/lingo/lingo-gr.cpp"
+#line 3157 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 605 "engines/director/lingo/lingo-gr.y"
+#line 604 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3168 "engines/director/lingo/lingo-gr.cpp"
+#line 3167 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 610 "engines/director/lingo/lingo-gr.y"
+#line 609 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3178 "engines/director/lingo/lingo-gr.cpp"
+#line 3177 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 616 "engines/director/lingo/lingo-gr.y"
+#line 615 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3188 "engines/director/lingo/lingo-gr.cpp"
+#line 3187 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 621 "engines/director/lingo/lingo-gr.y"
+#line 620 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3198 "engines/director/lingo/lingo-gr.cpp"
+#line 3197 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 627 "engines/director/lingo/lingo-gr.y"
+#line 626 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3206 "engines/director/lingo/lingo-gr.cpp"
+#line 3205 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 630 "engines/director/lingo/lingo-gr.y"
+#line 629 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3214 "engines/director/lingo/lingo-gr.cpp"
+#line 3213 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3220 "engines/director/lingo/lingo-gr.cpp"
+#line 3219 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 642 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3226 "engines/director/lingo/lingo-gr.cpp"
+#line 3225 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 643 "engines/director/lingo/lingo-gr.y"
+#line 642 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3232 "engines/director/lingo/lingo-gr.cpp"
+#line 3231 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 644 "engines/director/lingo/lingo-gr.y"
+#line 643 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3241 "engines/director/lingo/lingo-gr.cpp"
+#line 3240 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 647 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3250 "engines/director/lingo/lingo-gr.cpp"
+#line 3249 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 652 "engines/director/lingo/lingo-gr.y"
+#line 651 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3259 "engines/director/lingo/lingo-gr.cpp"
+#line 3258 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 660 "engines/director/lingo/lingo-gr.y"
+#line 659 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3268 "engines/director/lingo/lingo-gr.cpp"
+#line 3267 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 664 "engines/director/lingo/lingo-gr.y"
+#line 663 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3277 "engines/director/lingo/lingo-gr.cpp"
+#line 3276 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 668 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3286 "engines/director/lingo/lingo-gr.cpp"
+#line 3285 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 671 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3292 "engines/director/lingo/lingo-gr.cpp"
+#line 3291 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 671 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3301 "engines/director/lingo/lingo-gr.cpp"
+#line 3300 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 702 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3307 "engines/director/lingo/lingo-gr.cpp"
+#line 3306 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 702 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3313 "engines/director/lingo/lingo-gr.cpp"
+#line 3312 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 703 "engines/director/lingo/lingo-gr.y"
+#line 702 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3323 "engines/director/lingo/lingo-gr.cpp"
+#line 3322 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 708 "engines/director/lingo/lingo-gr.y"
+#line 707 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3329 "engines/director/lingo/lingo-gr.cpp"
+#line 3328 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 708 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3335 "engines/director/lingo/lingo-gr.cpp"
+#line 3334 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 710 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3345 "engines/director/lingo/lingo-gr.cpp"
+#line 3344 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 715 "engines/director/lingo/lingo-gr.y"
+#line 714 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3354,70 +3353,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3358 "engines/director/lingo/lingo-gr.cpp"
+#line 3357 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 723 "engines/director/lingo/lingo-gr.y"
+#line 722 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3368 "engines/director/lingo/lingo-gr.cpp"
+#line 3367 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 729 "engines/director/lingo/lingo-gr.y"
+#line 728 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3374 "engines/director/lingo/lingo-gr.cpp"
+#line 3373 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 729 "engines/director/lingo/lingo-gr.y"
+#line 728 "engines/director/lingo/lingo-gr.y"
                                 {
-		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
-#line 3381 "engines/director/lingo/lingo-gr.cpp"
+		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
+#line 3380 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 732 "engines/director/lingo/lingo-gr.y"
+#line 731 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3387 "engines/director/lingo/lingo-gr.cpp"
+#line 3386 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 732 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3393 "engines/director/lingo/lingo-gr.cpp"
+#line 3392 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 734 "engines/director/lingo/lingo-gr.y"
+#line 733 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3399 "engines/director/lingo/lingo-gr.cpp"
+#line 3398 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 737 "engines/director/lingo/lingo-gr.y"
+#line 736 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3405 "engines/director/lingo/lingo-gr.cpp"
+#line 3404 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 738 "engines/director/lingo/lingo-gr.y"
+#line 737 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3411 "engines/director/lingo/lingo-gr.cpp"
+#line 3410 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 740 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3417 "engines/director/lingo/lingo-gr.cpp"
+#line 3416 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 742 "engines/director/lingo/lingo-gr.y"
+#line 741 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3425,113 +3424,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3429 "engines/director/lingo/lingo-gr.cpp"
+#line 3428 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 749 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3435 "engines/director/lingo/lingo-gr.cpp"
+#line 3434 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 750 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3441 "engines/director/lingo/lingo-gr.cpp"
+#line 3440 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 752 "engines/director/lingo/lingo-gr.y"
+#line 751 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3447 "engines/director/lingo/lingo-gr.cpp"
+#line 3446 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 754 "engines/director/lingo/lingo-gr.y"
+#line 753 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3453 "engines/director/lingo/lingo-gr.cpp"
+#line 3452 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 755 "engines/director/lingo/lingo-gr.y"
+#line 754 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3459 "engines/director/lingo/lingo-gr.cpp"
+#line 3458 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 757 "engines/director/lingo/lingo-gr.y"
+#line 756 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3465 "engines/director/lingo/lingo-gr.cpp"
+#line 3464 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 759 "engines/director/lingo/lingo-gr.y"
+#line 758 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3471 "engines/director/lingo/lingo-gr.cpp"
+#line 3470 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 760 "engines/director/lingo/lingo-gr.y"
+#line 759 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3477 "engines/director/lingo/lingo-gr.cpp"
+#line 3476 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 761 "engines/director/lingo/lingo-gr.y"
+#line 760 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3483 "engines/director/lingo/lingo-gr.cpp"
+#line 3482 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 762 "engines/director/lingo/lingo-gr.y"
+#line 761 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3489 "engines/director/lingo/lingo-gr.cpp"
+#line 3488 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 764 "engines/director/lingo/lingo-gr.y"
+#line 763 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3495 "engines/director/lingo/lingo-gr.cpp"
+#line 3494 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 765 "engines/director/lingo/lingo-gr.y"
+#line 764 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3501 "engines/director/lingo/lingo-gr.cpp"
+#line 3500 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 767 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3507 "engines/director/lingo/lingo-gr.cpp"
+#line 3506 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175:
-#line 768 "engines/director/lingo/lingo-gr.y"
+#line 767 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3513 "engines/director/lingo/lingo-gr.cpp"
+#line 3512 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176:
-#line 770 "engines/director/lingo/lingo-gr.y"
+#line 769 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3522 "engines/director/lingo/lingo-gr.cpp"
+#line 3521 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177:
-#line 774 "engines/director/lingo/lingo-gr.y"
+#line 773 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3531 "engines/director/lingo/lingo-gr.cpp"
+#line 3530 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3535 "engines/director/lingo/lingo-gr.cpp"
+#line 3534 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3730,7 +3729,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 780 "engines/director/lingo/lingo-gr.y"
+#line 779 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index be6b0b5b46..d55c42a3c0 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 138 "engines/director/lingo/lingo-gr.y"
+#line 137 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 91aba75d90..ee3d962fbc 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -103,7 +103,6 @@ static void startDef() {
 static void endDef() {
 	g_lingo->clearArgStack();
 	inNone();
-	g_lingo->_ignoreMe = false;
 
 	delete g_lingo->_methodVars;
 	g_lingo->_methodVars = g_lingo->_methodVarsStash;
@@ -727,7 +726,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
 		delete $on; }
 
 on:  tON { startDef(); } ID 	{
-		$$ = $ID; g_lingo->_currentFactory = NULL; g_lingo->_ignoreMe = true; }
+		$$ = $ID; g_lingo->_currentFactory = NULL; }
 
 argdef:  /* nothing */ 			{ $$ = 0; }
 	| ID						{ g_lingo->codeArg($ID); mVar($ID, kVarArgument); $$ = 1; delete $ID; }
diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index 1f6e7020b9..2b0e23a5dc 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -427,7 +427,7 @@ static const YY_CHAR yy_ec[256] =
 
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    2,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1
@@ -1602,9 +1602,6 @@ YY_RULE_SETUP
 		count();
 		yylval.s = new Common::String(yytext);
 
-		if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
-			return ID;
-
 		// When we are defining arguments, allow any string
 		if (g_lingo->_indef == kStateInArgs)
 			return ID;
@@ -1640,41 +1637,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 428 "engines/director/lingo/lingo-lex.l"
+#line 425 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return FLOAT; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 429 "engines/director/lingo/lingo-lex.l"
+#line 426 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 430 "engines/director/lingo/lingo-lex.l"
+#line 427 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 67:
 /* rule 67 can match eol */
 YY_RULE_SETUP
-#line 431 "engines/director/lingo/lingo-lex.l"
+#line 428 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 432 "engines/director/lingo/lingo-lex.l"
+#line 429 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = cleanupString(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 433 "engines/director/lingo/lingo-lex.l"
+#line 430 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 435 "engines/director/lingo/lingo-lex.l"
+#line 432 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1677 "engines/director/lingo/lingo-lex.cpp"
+#line 1674 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2683,7 +2680,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 435 "engines/director/lingo/lingo-lex.l"
+#line 432 "engines/director/lingo/lingo-lex.l"
 
 
 extern int yydebug;
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index 73c2d2158f..7543b67dfb 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -390,9 +390,6 @@ word			{ count(); return varCheck(tWORD, "word"); }
 		count();
 		yylval.s = new Common::String(yytext);
 
-		if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
-			return ID;
-
 		// When we are defining arguments, allow any string
 		if (g_lingo->_indef == kStateInArgs)
 			return ID;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 4fe1106f97..ed3ec281c5 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -157,7 +157,6 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 	_abort = false;
 	_nextRepeat = false;
 	_indef = kStateNone;
-	_ignoreMe = false;
 	_immediateMode = false;
 
 	_linenumber = _colnumber = _bytenumber = _lastbytenumber = _errorbytenumber = 0;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index ce37fb7f89..467e35765f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -471,7 +471,6 @@ public:
 	bool _abort;
 	bool _nextRepeat;
 	LexerDefineState _indef;
-	bool _ignoreMe;
 	bool _immediateMode;
 	Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> *_methodVars;
 	Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> *_methodVarsStash;


Commit: 2d9dea678ad129d1fd33242dd221d817fbcebeeb
    https://github.com/scummvm/scummvm/commit/2d9dea678ad129d1fd33242dd221d817fbcebeeb
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Remove unnecessary instructions

Global and instance vars are both just added to the respective vartables
on parse instead of upon execution.

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-code.h
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 193c7a665a..5551328b21 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -80,14 +80,12 @@ static struct FuncDescr {
 	{ LC::c_exitRepeat,		"c_exitRepeat",		"" },
 	{ LC::c_floatpush,		"c_floatpush",		"f" },
 	{ LC::c_ge,				"c_ge",				"" },
-	{ LC::c_global,			"c_global",			"s" },
 	{ LC::c_goto,			"c_goto",			"" },
 	{ LC::c_gotoloop,		"c_gotoloop",		"" },
 	{ LC::c_gotonext,		"c_gotonext",		"" },
 	{ LC::c_gotoprevious,	"c_gotoprevious",	"" },
 	{ LC::c_gt,				"c_gt",				"" },
 	{ LC::c_hilite,			"c_hilite",			"" },
-	{ LC::c_instance,		"c_instance",		"s" },	// D2
 	{ LC::c_intersects,		"c_intersects",		"" },
 	{ LC::c_intpush,		"c_intpush",		"i" },
 	{ LC::c_itemOf,			"c_itemOf",			"" },	// D3
@@ -1474,40 +1472,12 @@ void LC::c_procret() {
 	}
 }
 
-void LC::c_global() {
-	Common::String name(g_lingo->readString());
-
-	if (!g_lingo->_globalvars.contains(name)) {
-		g_lingo->_globalvars[name] = Symbol();
-		g_lingo->_globalvars[name].name = new Common::String(name);
-		g_lingo->_globalvars[name].global = true;
-	}
-}
-
 void LC::c_property() {
 	Common::String name(g_lingo->readString());
 
 	warning("STUB: c_property()");
 }
 
-void LC::c_instance() {
-	Common::String name(g_lingo->readString());
-
-	warning("STUB: c_instance(%s)", name.c_str());
-}
-
-void LC::c_factory() {
-	Common::String name(g_lingo->readString());
-	Datum d;
-
-	warning("STUB: c_factory(%s)", name.c_str());
-
-	d.type = OBJECT;
-	d.u.s = new Common::String(name);
-
-	g_lingo->push(d);
-}
-
 void LC::c_open() {
 	Datum d2 = g_lingo->pop();
 	Datum d1 = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index d2cb192b25..5ffe5c8d8b 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -128,9 +128,6 @@ namespace LC {
 	void c_gotoloop();
 	void c_gotonext();
 	void c_gotoprevious();
-	void c_global();
-	void c_instance();
-	void c_factory();
 	void c_property();
 
 	void c_play();
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 7ff1767c4a..e9919cce57 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -454,7 +454,7 @@ void Lingo::varCreate(const Common::String &name, bool global, SymbolHash *local
 		if (global)
 			warning("varCreate: variable %s is instance or property, not global", name.c_str());
 		return;
-	} else  if (_globalvars.contains(name)) {
+	} else if (_globalvars.contains(name)) {
 		if (!global)
 			warning("varCreate: variable %s is global, not local", name.c_str());
 		return;
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 88bd048f70..35b8f74b8f 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -145,12 +145,14 @@ static void mVar(Common::String *s, VarType type) {
 			} else {
 				warning("Instance var '%s' defined outside factory", s->c_str());
 			}
+		} else if (type == kVarGlobal) {
+			g_lingo->varCreate(*s, true);
 		}
 	}
 }
 
 
-#line 154 "engines/director/lingo/lingo-gr.cpp"
+#line 156 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -287,7 +289,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 137 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -307,7 +309,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 311 "engines/director/lingo/lingo-gr.cpp"
+#line 313 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -861,24 +863,24 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   196,   196,   197,   199,   200,   201,   203,   210,   214,
-     225,   226,   227,   234,   241,   248,   255,   261,   268,   279,
-     286,   287,   288,   290,   291,   296,   308,   312,   315,   307,
-     339,   343,   346,   338,   372,   379,   385,   371,   413,   415,
-     418,   419,   421,   423,   430,   438,   439,   441,   447,   451,
-     455,   459,   462,   464,   465,   466,   468,   471,   474,   478,
-     482,   486,   494,   500,   501,   502,   513,   514,   515,   518,
-     521,   527,   527,   532,   535,   538,   543,   549,   550,   551,
-     552,   553,   554,   555,   556,   557,   558,   559,   560,   561,
-     562,   563,   564,   565,   566,   567,   568,   569,   570,   571,
-     573,   574,   575,   576,   577,   578,   579,   580,   582,   585,
-     587,   588,   589,   590,   591,   592,   592,   593,   593,   594,
-     594,   595,   598,   601,   602,   604,   609,   615,   620,   626,
-     629,   640,   641,   642,   643,   647,   651,   656,   657,   659,
-     663,   667,   671,   671,   701,   701,   701,   707,   708,   708,
-     714,   722,   728,   728,   731,   732,   733,   735,   736,   737,
-     739,   741,   749,   750,   751,   753,   754,   756,   758,   759,
-     760,   761,   763,   764,   766,   767,   769,   773
+       0,   198,   198,   199,   201,   202,   203,   205,   212,   216,
+     227,   228,   229,   236,   243,   250,   257,   263,   270,   281,
+     288,   289,   290,   292,   293,   298,   310,   314,   317,   309,
+     341,   345,   348,   340,   374,   381,   387,   373,   415,   417,
+     420,   421,   423,   425,   432,   440,   441,   443,   449,   453,
+     457,   461,   464,   466,   467,   468,   470,   473,   476,   480,
+     484,   488,   496,   502,   503,   504,   515,   516,   517,   520,
+     523,   529,   529,   534,   537,   540,   545,   551,   552,   553,
+     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
+     564,   565,   566,   567,   568,   569,   570,   571,   572,   573,
+     575,   576,   577,   578,   579,   580,   581,   582,   584,   587,
+     589,   590,   591,   592,   593,   594,   594,   595,   595,   596,
+     596,   597,   600,   603,   604,   606,   609,   613,   618,   624,
+     627,   638,   639,   640,   641,   645,   649,   654,   655,   657,
+     661,   665,   669,   669,   699,   699,   699,   705,   706,   706,
+     712,   720,   726,   726,   729,   730,   731,   733,   734,   735,
+     737,   739,   747,   748,   749,   751,   752,   754,   756,   757,
+     758,   759,   761,   762,   764,   765,   767,   771
 };
 #endif
 
@@ -1949,81 +1951,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1955 "engines/director/lingo/lingo-gr.cpp"
+#line 1957 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1961 "engines/director/lingo/lingo-gr.cpp"
+#line 1963 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1967 "engines/director/lingo/lingo-gr.cpp"
+#line 1969 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1973 "engines/director/lingo/lingo-gr.cpp"
+#line 1975 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1979 "engines/director/lingo/lingo-gr.cpp"
+#line 1981 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1985 "engines/director/lingo/lingo-gr.cpp"
+#line 1987 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1991 "engines/director/lingo/lingo-gr.cpp"
+#line 1993 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1997 "engines/director/lingo/lingo-gr.cpp"
+#line 1999 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2003 "engines/director/lingo/lingo-gr.cpp"
+#line 2005 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2009 "engines/director/lingo/lingo-gr.cpp"
+#line 2011 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2015 "engines/director/lingo/lingo-gr.cpp"
+#line 2017 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 192 "engines/director/lingo/lingo-gr.y"
+#line 194 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2021 "engines/director/lingo/lingo-gr.cpp"
+#line 2023 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 148: /* on  */
-#line 191 "engines/director/lingo/lingo-gr.y"
+#line 193 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2027 "engines/director/lingo/lingo-gr.cpp"
+#line 2029 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2302,7 +2304,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 203 "engines/director/lingo/lingo-gr.y"
+#line 205 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2310,19 +2312,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2314 "engines/director/lingo/lingo-gr.cpp"
+#line 2316 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 210 "engines/director/lingo/lingo-gr.y"
+#line 212 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2322 "engines/director/lingo/lingo-gr.cpp"
+#line 2324 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 214 "engines/director/lingo/lingo-gr.y"
+#line 216 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2334,23 +2336,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2338 "engines/director/lingo/lingo-gr.cpp"
+#line 2340 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 225 "engines/director/lingo/lingo-gr.y"
+#line 227 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2344 "engines/director/lingo/lingo-gr.cpp"
+#line 2346 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 226 "engines/director/lingo/lingo-gr.y"
+#line 228 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2350 "engines/director/lingo/lingo-gr.cpp"
+#line 2352 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 227 "engines/director/lingo/lingo-gr.y"
+#line 229 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2358,11 +2360,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2362 "engines/director/lingo/lingo-gr.cpp"
+#line 2364 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 234 "engines/director/lingo/lingo-gr.y"
+#line 236 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2370,11 +2372,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2374 "engines/director/lingo/lingo-gr.cpp"
+#line 2376 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 241 "engines/director/lingo/lingo-gr.y"
+#line 243 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2382,11 +2384,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2386 "engines/director/lingo/lingo-gr.cpp"
+#line 2388 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 248 "engines/director/lingo/lingo-gr.y"
+#line 250 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2394,33 +2396,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2398 "engines/director/lingo/lingo-gr.cpp"
+#line 2400 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 255 "engines/director/lingo/lingo-gr.y"
+#line 257 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2409 "engines/director/lingo/lingo-gr.cpp"
+#line 2411 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 261 "engines/director/lingo/lingo-gr.y"
+#line 263 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2420 "engines/director/lingo/lingo-gr.cpp"
+#line 2422 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 268 "engines/director/lingo/lingo-gr.y"
+#line 270 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2432,54 +2434,54 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2436 "engines/director/lingo/lingo-gr.cpp"
+#line 2438 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 279 "engines/director/lingo/lingo-gr.y"
+#line 281 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2447 "engines/director/lingo/lingo-gr.cpp"
+#line 2449 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 296 "engines/director/lingo/lingo-gr.y"
+#line 298 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-5].code) - (yyvsp[-1].code) + 1);
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code) + 2);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentScript)[(yyvsp[-1].code)] = start; }
-#line 2458 "engines/director/lingo/lingo-gr.cpp"
+#line 2460 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 308 "engines/director/lingo/lingo-gr.y"
+#line 310 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2466 "engines/director/lingo/lingo-gr.cpp"
+#line 2468 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 312 "engines/director/lingo/lingo-gr.y"
+#line 314 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2473 "engines/director/lingo/lingo-gr.cpp"
+#line 2475 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 315 "engines/director/lingo/lingo-gr.y"
+#line 317 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2479 "engines/director/lingo/lingo-gr.cpp"
+#line 2481 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 315 "engines/director/lingo/lingo-gr.y"
+#line 317 "engines/director/lingo/lingo-gr.y"
                                                                                           {
 
 		g_lingo->code1(LC::c_eval);
@@ -2498,32 +2500,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2502 "engines/director/lingo/lingo-gr.cpp"
+#line 2504 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 339 "engines/director/lingo/lingo-gr.y"
+#line 341 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2510 "engines/director/lingo/lingo-gr.cpp"
+#line 2512 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 343 "engines/director/lingo/lingo-gr.y"
+#line 345 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2517 "engines/director/lingo/lingo-gr.cpp"
+#line 2519 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 346 "engines/director/lingo/lingo-gr.y"
+#line 348 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2523 "engines/director/lingo/lingo-gr.cpp"
+#line 2525 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 347 "engines/director/lingo/lingo-gr.y"
+#line 349 "engines/director/lingo/lingo-gr.y"
                                                     {
 
 		g_lingo->code1(LC::c_eval);
@@ -2542,32 +2544,32 @@ yyreduce:
 		WRITE_UINT32(&end, pos - (yyvsp[-2].code) + 2);
 		(*g_lingo->_currentScript)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-2].code)] = end;	}
-#line 2546 "engines/director/lingo/lingo-gr.cpp"
+#line 2548 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 372 "engines/director/lingo/lingo-gr.y"
+#line 374 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2557 "engines/director/lingo/lingo-gr.cpp"
+#line 2559 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 379 "engines/director/lingo/lingo-gr.y"
+#line 381 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2567 "engines/director/lingo/lingo-gr.cpp"
+#line 2569 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 385 "engines/director/lingo/lingo-gr.y"
+#line 387 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2578,11 +2580,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), globalCheck());
 				  g_lingo->code1(LC::c_assign); }
-#line 2582 "engines/director/lingo/lingo-gr.cpp"
+#line 2584 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 395 "engines/director/lingo/lingo-gr.y"
+#line 397 "engines/director/lingo/lingo-gr.y"
                                             {
 
 		g_lingo->code1(LC::c_intpush);
@@ -2600,44 +2602,44 @@ yyreduce:
 
 		(*g_lingo->_currentScript)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end;	}
-#line 2604 "engines/director/lingo/lingo-gr.cpp"
+#line 2606 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 413 "engines/director/lingo/lingo-gr.y"
+#line 415 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2611 "engines/director/lingo/lingo-gr.cpp"
+#line 2613 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 415 "engines/director/lingo/lingo-gr.y"
+#line 417 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2619 "engines/director/lingo/lingo-gr.cpp"
+#line 2621 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 418 "engines/director/lingo/lingo-gr.y"
+#line 420 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2625 "engines/director/lingo/lingo-gr.cpp"
+#line 2627 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 419 "engines/director/lingo/lingo-gr.y"
+#line 421 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2631 "engines/director/lingo/lingo-gr.cpp"
+#line 2633 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 421 "engines/director/lingo/lingo-gr.y"
+#line 423 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2637 "engines/director/lingo/lingo-gr.cpp"
+#line 2639 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 423 "engines/director/lingo/lingo-gr.y"
+#line 425 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2645,11 +2647,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2649 "engines/director/lingo/lingo-gr.cpp"
+#line 2651 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 430 "engines/director/lingo/lingo-gr.y"
+#line 432 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2657,107 +2659,107 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2661 "engines/director/lingo/lingo-gr.cpp"
+#line 2663 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 441 "engines/director/lingo/lingo-gr.y"
+#line 443 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentScript)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2671 "engines/director/lingo/lingo-gr.cpp"
+#line 2673 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 447 "engines/director/lingo/lingo-gr.y"
+#line 449 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2679 "engines/director/lingo/lingo-gr.cpp"
+#line 2681 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 451 "engines/director/lingo/lingo-gr.y"
+#line 453 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2687 "engines/director/lingo/lingo-gr.cpp"
+#line 2689 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 455 "engines/director/lingo/lingo-gr.y"
+#line 457 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentScript->size() - 1; }
-#line 2695 "engines/director/lingo/lingo-gr.cpp"
+#line 2697 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 459 "engines/director/lingo/lingo-gr.y"
+#line 461 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2702 "engines/director/lingo/lingo-gr.cpp"
+#line 2704 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 462 "engines/director/lingo/lingo-gr.y"
+#line 464 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2708 "engines/director/lingo/lingo-gr.cpp"
+#line 2710 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 464 "engines/director/lingo/lingo-gr.y"
+#line 466 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2714 "engines/director/lingo/lingo-gr.cpp"
+#line 2716 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 468 "engines/director/lingo/lingo-gr.y"
+#line 470 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2722 "engines/director/lingo/lingo-gr.cpp"
+#line 2724 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 471 "engines/director/lingo/lingo-gr.y"
+#line 473 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2730 "engines/director/lingo/lingo-gr.cpp"
+#line 2732 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 474 "engines/director/lingo/lingo-gr.y"
+#line 476 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2739 "engines/director/lingo/lingo-gr.cpp"
+#line 2741 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 478 "engines/director/lingo/lingo-gr.y"
+#line 480 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2748 "engines/director/lingo/lingo-gr.cpp"
+#line 2750 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 482 "engines/director/lingo/lingo-gr.y"
+#line 484 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2757 "engines/director/lingo/lingo-gr.cpp"
+#line 2759 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 486 "engines/director/lingo/lingo-gr.y"
+#line 488 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2766,28 +2768,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2770 "engines/director/lingo/lingo-gr.cpp"
+#line 2772 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 494 "engines/director/lingo/lingo-gr.y"
+#line 496 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2781 "engines/director/lingo/lingo-gr.cpp"
+#line 2783 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 500 "engines/director/lingo/lingo-gr.y"
+#line 502 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2787 "engines/director/lingo/lingo-gr.cpp"
+#line 2789 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 502 "engines/director/lingo/lingo-gr.y"
+#line 504 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2798,369 +2800,367 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2802 "engines/director/lingo/lingo-gr.cpp"
+#line 2804 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 513 "engines/director/lingo/lingo-gr.y"
+#line 515 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2808 "engines/director/lingo/lingo-gr.cpp"
+#line 2810 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 515 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2816 "engines/director/lingo/lingo-gr.cpp"
+#line 2818 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 520 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2824 "engines/director/lingo/lingo-gr.cpp"
+#line 2826 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 521 "engines/director/lingo/lingo-gr.y"
+#line 523 "engines/director/lingo/lingo-gr.y"
                                       {
 			g_lingo->code1(LC::c_lazyeval);
 			g_lingo->codeString((yyvsp[-1].s)->c_str());
 			g_lingo->codeFunc((yyvsp[-3].s), 1);
 			delete (yyvsp[-3].s);
 			delete (yyvsp[-1].s); }
-#line 2835 "engines/director/lingo/lingo-gr.cpp"
+#line 2837 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 529 "engines/director/lingo/lingo-gr.y"
                                       { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
-#line 2841 "engines/director/lingo/lingo-gr.cpp"
+#line 2843 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 528 "engines/director/lingo/lingo-gr.y"
+#line 530 "engines/director/lingo/lingo-gr.y"
                                                     {
 			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
 			delete (yyvsp[-6].s);
 			delete (yyvsp[-4].s); }
-#line 2850 "engines/director/lingo/lingo-gr.cpp"
+#line 2852 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 532 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2858 "engines/director/lingo/lingo-gr.cpp"
+#line 2860 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 537 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2866 "engines/director/lingo/lingo-gr.cpp"
+#line 2868 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 538 "engines/director/lingo/lingo-gr.y"
+#line 540 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2876 "engines/director/lingo/lingo-gr.cpp"
+#line 2878 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 543 "engines/director/lingo/lingo-gr.y"
+#line 545 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2887 "engines/director/lingo/lingo-gr.cpp"
+#line 2889 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 550 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2893 "engines/director/lingo/lingo-gr.cpp"
+#line 2895 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 551 "engines/director/lingo/lingo-gr.y"
+#line 553 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2899 "engines/director/lingo/lingo-gr.cpp"
+#line 2901 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 552 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2905 "engines/director/lingo/lingo-gr.cpp"
+#line 2907 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2911 "engines/director/lingo/lingo-gr.cpp"
+#line 2913 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 554 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2917 "engines/director/lingo/lingo-gr.cpp"
+#line 2919 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 555 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2923 "engines/director/lingo/lingo-gr.cpp"
+#line 2925 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 558 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2929 "engines/director/lingo/lingo-gr.cpp"
+#line 2931 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2935 "engines/director/lingo/lingo-gr.cpp"
+#line 2937 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 560 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2941 "engines/director/lingo/lingo-gr.cpp"
+#line 2943 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 559 "engines/director/lingo/lingo-gr.y"
+#line 561 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2947 "engines/director/lingo/lingo-gr.cpp"
+#line 2949 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 562 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2953 "engines/director/lingo/lingo-gr.cpp"
+#line 2955 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2959 "engines/director/lingo/lingo-gr.cpp"
+#line 2961 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 562 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2965 "engines/director/lingo/lingo-gr.cpp"
+#line 2967 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 563 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2971 "engines/director/lingo/lingo-gr.cpp"
+#line 2973 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2977 "engines/director/lingo/lingo-gr.cpp"
+#line 2979 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 565 "engines/director/lingo/lingo-gr.y"
+#line 567 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2983 "engines/director/lingo/lingo-gr.cpp"
+#line 2985 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 568 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2989 "engines/director/lingo/lingo-gr.cpp"
+#line 2991 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 569 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2995 "engines/director/lingo/lingo-gr.cpp"
+#line 2997 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 3001 "engines/director/lingo/lingo-gr.cpp"
+#line 3003 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 569 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 3007 "engines/director/lingo/lingo-gr.cpp"
+#line 3009 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 572 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 3013 "engines/director/lingo/lingo-gr.cpp"
+#line 3015 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 573 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 3019 "engines/director/lingo/lingo-gr.cpp"
+#line 3021 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 573 "engines/director/lingo/lingo-gr.y"
+#line 575 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 3025 "engines/director/lingo/lingo-gr.cpp"
+#line 3027 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 574 "engines/director/lingo/lingo-gr.y"
+#line 576 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 3031 "engines/director/lingo/lingo-gr.cpp"
+#line 3033 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 577 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 3037 "engines/director/lingo/lingo-gr.cpp"
+#line 3039 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 576 "engines/director/lingo/lingo-gr.y"
+#line 578 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3043 "engines/director/lingo/lingo-gr.cpp"
+#line 3045 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 577 "engines/director/lingo/lingo-gr.y"
+#line 579 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3049 "engines/director/lingo/lingo-gr.cpp"
+#line 3051 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 578 "engines/director/lingo/lingo-gr.y"
+#line 580 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3055 "engines/director/lingo/lingo-gr.cpp"
+#line 3057 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 579 "engines/director/lingo/lingo-gr.y"
+#line 581 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3061 "engines/director/lingo/lingo-gr.cpp"
+#line 3063 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 580 "engines/director/lingo/lingo-gr.y"
+#line 582 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3067 "engines/director/lingo/lingo-gr.cpp"
+#line 3069 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 108:
-#line 582 "engines/director/lingo/lingo-gr.y"
+#line 584 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3075 "engines/director/lingo/lingo-gr.cpp"
+#line 3077 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 587 "engines/director/lingo/lingo-gr.y"
+#line 589 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3081 "engines/director/lingo/lingo-gr.cpp"
+#line 3083 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 590 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_exitRepeat); }
-#line 3087 "engines/director/lingo/lingo-gr.cpp"
+#line 3089 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 591 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3093 "engines/director/lingo/lingo-gr.cpp"
+#line 3095 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3099 "engines/director/lingo/lingo-gr.cpp"
+#line 3101 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                                                  { inNone(); }
-#line 3105 "engines/director/lingo/lingo-gr.cpp"
+#line 3107 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3111 "engines/director/lingo/lingo-gr.cpp"
+#line 3113 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3117 "engines/director/lingo/lingo-gr.cpp"
+#line 3119 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3123 "engines/director/lingo/lingo-gr.cpp"
+#line 3125 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
                                                                                    { inNone(); }
-#line 3129 "engines/director/lingo/lingo-gr.cpp"
+#line 3131 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 595 "engines/director/lingo/lingo-gr.y"
+#line 597 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3137 "engines/director/lingo/lingo-gr.cpp"
+#line 3139 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 598 "engines/director/lingo/lingo-gr.y"
+#line 600 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3145 "engines/director/lingo/lingo-gr.cpp"
+#line 3147 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 601 "engines/director/lingo/lingo-gr.y"
+#line 603 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3151 "engines/director/lingo/lingo-gr.cpp"
+#line 3153 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 604 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3157 "engines/director/lingo/lingo-gr.cpp"
+#line 3159 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 604 "engines/director/lingo/lingo-gr.y"
+#line 606 "engines/director/lingo/lingo-gr.y"
                                                 {
-		g_lingo->code1(LC::c_global);
-		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
 #line 3167 "engines/director/lingo/lingo-gr.cpp"
@@ -3169,182 +3169,180 @@ yyreduce:
   case 126:
 #line 609 "engines/director/lingo/lingo-gr.y"
                                                 {
-		g_lingo->code1(LC::c_global);
-		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3177 "engines/director/lingo/lingo-gr.cpp"
+#line 3175 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 615 "engines/director/lingo/lingo-gr.y"
+#line 613 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3187 "engines/director/lingo/lingo-gr.cpp"
+#line 3185 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 620 "engines/director/lingo/lingo-gr.y"
+#line 618 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3197 "engines/director/lingo/lingo-gr.cpp"
+#line 3195 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 626 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3205 "engines/director/lingo/lingo-gr.cpp"
+#line 3203 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 629 "engines/director/lingo/lingo-gr.y"
+#line 627 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3213 "engines/director/lingo/lingo-gr.cpp"
+#line 3211 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3219 "engines/director/lingo/lingo-gr.cpp"
+#line 3217 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 639 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3225 "engines/director/lingo/lingo-gr.cpp"
+#line 3223 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 642 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3231 "engines/director/lingo/lingo-gr.cpp"
+#line 3229 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 643 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3240 "engines/director/lingo/lingo-gr.cpp"
+#line 3238 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 647 "engines/director/lingo/lingo-gr.y"
+#line 645 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3249 "engines/director/lingo/lingo-gr.cpp"
+#line 3247 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 651 "engines/director/lingo/lingo-gr.y"
+#line 649 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3258 "engines/director/lingo/lingo-gr.cpp"
+#line 3256 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 659 "engines/director/lingo/lingo-gr.y"
+#line 657 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3267 "engines/director/lingo/lingo-gr.cpp"
+#line 3265 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 661 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3276 "engines/director/lingo/lingo-gr.cpp"
+#line 3274 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 667 "engines/director/lingo/lingo-gr.y"
+#line 665 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3285 "engines/director/lingo/lingo-gr.cpp"
+#line 3283 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 669 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3291 "engines/director/lingo/lingo-gr.cpp"
+#line 3289 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 669 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3300 "engines/director/lingo/lingo-gr.cpp"
+#line 3298 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 699 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3306 "engines/director/lingo/lingo-gr.cpp"
+#line 3304 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 699 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3312 "engines/director/lingo/lingo-gr.cpp"
+#line 3310 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 702 "engines/director/lingo/lingo-gr.y"
+#line 700 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3322 "engines/director/lingo/lingo-gr.cpp"
+#line 3320 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 707 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3328 "engines/director/lingo/lingo-gr.cpp"
+#line 3326 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 708 "engines/director/lingo/lingo-gr.y"
+#line 706 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3334 "engines/director/lingo/lingo-gr.cpp"
+#line 3332 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 707 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3344 "engines/director/lingo/lingo-gr.cpp"
+#line 3342 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 714 "engines/director/lingo/lingo-gr.y"
+#line 712 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3353,70 +3351,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3357 "engines/director/lingo/lingo-gr.cpp"
+#line 3355 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 722 "engines/director/lingo/lingo-gr.y"
+#line 720 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3367 "engines/director/lingo/lingo-gr.cpp"
+#line 3365 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 728 "engines/director/lingo/lingo-gr.y"
+#line 726 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3373 "engines/director/lingo/lingo-gr.cpp"
+#line 3371 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 728 "engines/director/lingo/lingo-gr.y"
+#line 726 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
-#line 3380 "engines/director/lingo/lingo-gr.cpp"
+#line 3378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 731 "engines/director/lingo/lingo-gr.y"
+#line 729 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3386 "engines/director/lingo/lingo-gr.cpp"
+#line 3384 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 732 "engines/director/lingo/lingo-gr.y"
+#line 730 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3392 "engines/director/lingo/lingo-gr.cpp"
+#line 3390 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 731 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3398 "engines/director/lingo/lingo-gr.cpp"
+#line 3396 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 736 "engines/director/lingo/lingo-gr.y"
+#line 734 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3404 "engines/director/lingo/lingo-gr.cpp"
+#line 3402 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 737 "engines/director/lingo/lingo-gr.y"
+#line 735 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3410 "engines/director/lingo/lingo-gr.cpp"
+#line 3408 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 739 "engines/director/lingo/lingo-gr.y"
+#line 737 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3416 "engines/director/lingo/lingo-gr.cpp"
+#line 3414 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 741 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3424,113 +3422,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3428 "engines/director/lingo/lingo-gr.cpp"
+#line 3426 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 749 "engines/director/lingo/lingo-gr.y"
+#line 747 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3434 "engines/director/lingo/lingo-gr.cpp"
+#line 3432 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 748 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3440 "engines/director/lingo/lingo-gr.cpp"
+#line 3438 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 749 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3446 "engines/director/lingo/lingo-gr.cpp"
+#line 3444 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 753 "engines/director/lingo/lingo-gr.y"
+#line 751 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3452 "engines/director/lingo/lingo-gr.cpp"
+#line 3450 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 754 "engines/director/lingo/lingo-gr.y"
+#line 752 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3458 "engines/director/lingo/lingo-gr.cpp"
+#line 3456 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 756 "engines/director/lingo/lingo-gr.y"
+#line 754 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3464 "engines/director/lingo/lingo-gr.cpp"
+#line 3462 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 758 "engines/director/lingo/lingo-gr.y"
+#line 756 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3470 "engines/director/lingo/lingo-gr.cpp"
+#line 3468 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 759 "engines/director/lingo/lingo-gr.y"
+#line 757 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3476 "engines/director/lingo/lingo-gr.cpp"
+#line 3474 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 760 "engines/director/lingo/lingo-gr.y"
+#line 758 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3482 "engines/director/lingo/lingo-gr.cpp"
+#line 3480 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 761 "engines/director/lingo/lingo-gr.y"
+#line 759 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3488 "engines/director/lingo/lingo-gr.cpp"
+#line 3486 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 763 "engines/director/lingo/lingo-gr.y"
+#line 761 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3494 "engines/director/lingo/lingo-gr.cpp"
+#line 3492 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 764 "engines/director/lingo/lingo-gr.y"
+#line 762 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3500 "engines/director/lingo/lingo-gr.cpp"
+#line 3498 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 766 "engines/director/lingo/lingo-gr.y"
+#line 764 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3506 "engines/director/lingo/lingo-gr.cpp"
+#line 3504 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175:
-#line 767 "engines/director/lingo/lingo-gr.y"
+#line 765 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3512 "engines/director/lingo/lingo-gr.cpp"
+#line 3510 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176:
-#line 769 "engines/director/lingo/lingo-gr.y"
+#line 767 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3521 "engines/director/lingo/lingo-gr.cpp"
+#line 3519 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177:
-#line 773 "engines/director/lingo/lingo-gr.y"
+#line 771 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3530 "engines/director/lingo/lingo-gr.cpp"
+#line 3528 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3534 "engines/director/lingo/lingo-gr.cpp"
+#line 3532 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3729,7 +3727,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 779 "engines/director/lingo/lingo-gr.y"
+#line 777 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index d55c42a3c0..4310d7d043 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 137 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index ee3d962fbc..87949fb80e 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -128,6 +128,8 @@ static void mVar(Common::String *s, VarType type) {
 			} else {
 				warning("Instance var '%s' defined outside factory", s->c_str());
 			}
+		} else if (type == kVarGlobal) {
+			g_lingo->varCreate(*s, true);
 		}
 	}
 }
@@ -602,13 +604,9 @@ proc: tPUT expr					{ g_lingo->code1(LC::c_printtop); }
 	| tOPEN expr 				{ g_lingo->code2(LC::c_voidpush, LC::c_open); }
 
 globallist: ID					{
-		g_lingo->code1(LC::c_global);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarGlobal);
 		delete $ID; }
 	| globallist ',' ID			{
-		g_lingo->code1(LC::c_global);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarGlobal);
 		delete $ID; }
 


Commit: 2daf4721c9e371bb3085b9fc3baf24c9b227b118
    https://github.com/scummvm/scummvm/commit/2daf4721c9e371bb3085b9fc3baf24c9b227b118
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Implement b_factory

Removed the inheritanceLevel check in b_objectp because it should
return 1 if called with an object return by b_factory, for some
reason...

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-builtins.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 1196b6e4dd..b1f0fbd626 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -162,7 +162,7 @@ static struct BuiltinProto {
 		// when mouseUp													// D2
 		// when timeOut													// D2
 	// Types
-	{ "factory",		LB::b_factoryP,		1, 1, true,  3, FBLTIN },	//		D3
+	{ "factory",		LB::b_factory,		1, 1, true,  3, FBLTIN },	//		D3
 	{ "floatP",			LB::b_floatP,		1, 1, true,  3, FBLTIN },	//		D3
 	{ "ilk",	 		LB::b_ilk,			1, 2, false, 4, FBLTIN },	//			D4 f
 	{ "integerp",		LB::b_integerp,		1, 1, true,  2, FBLTIN },	// D2 f
@@ -1294,12 +1294,16 @@ void LB::b_startTimer(int nargs) {
 ///////////////////
 // Types
 ///////////////////
-void LB::b_factoryP(int nargs) {
-	Datum d = g_lingo->pop();
-	Datum res(d.asInt());
-	g_lingo->push(res);
-
-	warning("STUB: b_factoryP");
+void LB::b_factory(int nargs) {
+	Datum factoryName = g_lingo->pop();
+	factoryName.type = VAR;
+	Datum o = g_lingo->varFetch(factoryName, true);
+	if (o.type == OBJECT && o.u.obj->type == kFactoryObj
+			&& o.u.obj->name->equalsIgnoreCase(*factoryName.u.s) && o.u.obj->inheritanceLevel == 1) {
+		g_lingo->push(o);
+	} else {
+		g_lingo->push(Datum(0));
+	}
 }
 
 void LB::b_floatP(int nargs) {
@@ -1324,11 +1328,7 @@ void LB::b_objectp(int nargs) {
 	Datum d = g_lingo->pop();
 	Datum res;
 	if (d.type == OBJECT) {
-		if (d.u.obj->type == kFactoryObj && (d.u.obj->inheritanceLevel == 1 || d.u.obj->disposed)) {
-			res = 0;
-		} else {
-			res = 1;
-		}
+		res = !d.u.obj->disposed;
 	} else {
 		res = 0;
 	}
diff --git a/engines/director/lingo/lingo-builtins.h b/engines/director/lingo/lingo-builtins.h
index bd4e58278e..77b1c80da0 100644
--- a/engines/director/lingo/lingo-builtins.h
+++ b/engines/director/lingo/lingo-builtins.h
@@ -75,7 +75,7 @@ namespace LB {
 	void b_setProp(int nargs);
 	void b_sort(int nargs);
 
-	void b_factoryP(int nargs);
+	void b_factory(int nargs);
 	void b_floatP(int nargs);
 	void b_ilk(int nargs);
 	void b_integerp(int nargs);
@@ -189,8 +189,6 @@ namespace LB {
 	void b_true(int nargs);
 	void b_version(int nargs);
 
-	void b_factory(int nargs);
-
 	void b_cast(int nargs);
 	void b_field(int nargs);
 	void b_script(int nargs);


Commit: c01b88c2e8686ce1deba5b73cce5ef111b8777d5
    https://github.com/scummvm/scummvm/commit/c01b88c2e8686ce1deba5b73cce5ef111b8777d5
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-06T18:34:06+02:00

Commit Message:
DIRECTOR: LINGO: Clean up lingo-object.cpp

Changed paths:
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 45ef7a5a85..4f1a03d26c 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -80,7 +80,7 @@ Object *Object::clone() {
 	return res;
 }
 
-Symbol Object::getMethod(const Common::String methodName) {
+Symbol Object::getMethod(const Common::String &methodName) {
 	if (disposed) {
 		error("Method '%s' called on disposed object '%s'", methodName.c_str(), name->c_str());
 	}
@@ -93,7 +93,7 @@ Symbol Object::getMethod(const Common::String methodName) {
 	return Symbol();
 }
 
-bool Object::hasVar(const Common::String varName) {
+bool Object::hasVar(const Common::String &varName) {
 	if (disposed) {
 		error("Variable '%s' accessed on disposed object '%s'", varName.c_str(), name->c_str());
 	}
@@ -105,14 +105,26 @@ bool Object::hasVar(const Common::String varName) {
 	return properties.contains(varName);
 }
 
-Symbol &Object::getVar(const Common::String varName) {
+Symbol &Object::getVar(const Common::String &varName) {
 	return properties[varName];
 }
 
+// Initialization/disposal
+
+void LM::m_new(int nargs) {
+	// This is usually overridden by a user-defined mNew
+	Datum res;
+	res.type = OBJECT;
+	res.u.obj = g_lingo->_currentMeObj;
+	g_lingo->push(res);
+}
+
 void LM::m_dispose(int nargs) {
 	g_lingo->_currentMeObj->disposed = true;
 }
 
+// Object array
+
 void LM::m_get(int nargs) {
 	Datum indexD = g_lingo->pop();
 	uint index = MAX(0, indexD.asInt());
@@ -130,12 +142,4 @@ void LM::m_put(int nargs) {
 	(*g_lingo->_currentMeObj->objArray)[index] = value;
 }
 
-void LM::m_new(int nargs) {
-	// This is usually be overridden by a user-defined mNew
-	Datum res;
-	res.type = OBJECT;
-	res.u.obj = g_lingo->_currentMeObj;
-	g_lingo->push(res);
-}
-
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 467e35765f..d4e1c56d72 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -265,9 +265,9 @@ struct Object {
     Common::HashMap<uint, Datum> *objArray;
 
 	Object *clone();
-	Symbol getMethod(const Common::String methodName);
-	bool hasVar(const Common::String varName);
-	Symbol &getVar(const Common::String varName);
+	Symbol getMethod(const Common::String &methodName);
+	bool hasVar(const Common::String &varName);
+	Symbol &getVar(const Common::String &varName);
 };
 
 struct CFrame {	/* proc/func call stack frame */
@@ -342,7 +342,7 @@ private:
 	// lingo-events.cpp
 private:
 	void initEventHandlerTypes();
-	void setPrimaryEventHandler(LEvent event, Common::String &code);
+	void setPrimaryEventHandler(LEvent event, const Common::String &code);
 	void primaryEventHandler(LEvent event);
 	void registerInputEvent(LEvent event);
 	void registerFrameEvent(LEvent event);




More information about the Scummvm-git-logs mailing list