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

djsrv dservilla at gmail.com
Thu Jun 18 16:33:58 UTC 2020


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

Summary:
c4914ea3ca DIRECTOR: LINGO: Add name to ScriptContext
d14e10539b DIRECTOR: Add _score to Cast
f2ec6cbf63 DIRECTOR: LINGO: Implement b_script


Commit: c4914ea3cac01acd7baf451055c35b609181c855
    https://github.com/scummvm/scummvm/commit/c4914ea3cac01acd7baf451055c35b609181c855
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00

Commit Message:
DIRECTOR: LINGO: Add name to ScriptContext

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


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


Commit: d14e10539b865573f45c11787cd29ff7276d7bbe
    https://github.com/scummvm/scummvm/commit/d14e10539b865573f45c11787cd29ff7276d7bbe
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00

Commit Message:
DIRECTOR: Add _score to Cast

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/score-loading.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 6e10e451e4..124c84e25e 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -37,6 +37,7 @@ namespace Director {
 
 Cast::Cast() {
 	_type = kCastTypeNull;
+	_score = nullptr;
 	_widget = nullptr;
 	_hilite = false;
 
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 50fe39b950..8d97cb9e2b 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -63,6 +63,7 @@ public:
 	virtual void getColors(int *fgcolor, int *bgcolor) { return; }
 
 	CastType _type;
+	Score *_score;
 	Common::Rect _initialRect;
 	Common::Rect _boundingRect;
 	Common::Array<Resource> _children;
diff --git a/engines/director/score-loading.cpp b/engines/director/score-loading.cpp
index f94006443e..21422b199a 100644
--- a/engines/director/score-loading.cpp
+++ b/engines/director/score-loading.cpp
@@ -674,8 +674,9 @@ void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 		default:
 			warning("Score::loadCastDataVWCR(): Unhandled cast id: %d(%s), type: %d, %d bytes", id, numToCastNum(id), castType, size);
 			stream.skip(size - 1);
-			break;
+			continue;
 		}
+		_loadedCast->getVal(id)->_score = this;
 	}
 }
 
@@ -894,6 +895,8 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 		}
 
 		_castsInfo[id] = ci;
+
+		member->_score = this;
 	}
 
 	if (size3)


Commit: f2ec6cbf638de3f0742d1030162442266801784e
    https://github.com/scummvm/scummvm/commit/f2ec6cbf638de3f0742d1030162442266801784e
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00

Commit Message:
DIRECTOR: LINGO: Implement b_script

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/score.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 30f18c855c..5dd44ab790 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -520,7 +520,7 @@ void LB::b_value(int nargs) {
 	Common::String code = "scummvm_returnNumber " + expr;
 	// Compile the code to an anonymous function and call it
 	ScriptContext *sc = g_lingo->addCode(code.c_str(), kArchNone, kNoneScript, 0);
-	Symbol sym = sc->eventHandlers[kEventNone];
+	Symbol sym = sc->_eventHandlers[kEventNone];
 	LC::call(sym, 0);
 	delete sc;
 }
@@ -2159,12 +2159,24 @@ void LB::b_field(int nargs) {
 
 void LB::b_script(int nargs) {
 	Datum d = g_lingo->pop();
+	int castId = g_lingo->castIdFetch(d);
+	Cast *cast = g_director->getCastMember(castId);
 
-	warning("STUB: b_script");
+	if (cast) {
+		ScriptContext *script = nullptr;
 
-	Datum res(0);
-	d.type = REFERENCE;
-	g_lingo->push(res);
+		if (cast->_type == kCastLingoScript)
+			script = g_lingo->getScriptContext(cast->_score->_lingoArchive, kMovieScript, castId);
+		else
+			script = g_lingo->getScriptContext(cast->_score->_lingoArchive, kCastScript, castId);
+
+		if (script) {
+			g_lingo->push(Datum(script->getObject()));
+			return;
+		}
+	}
+
+	g_lingo->push(Datum());
 }
 
 void LB::b_window(int nargs) {
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index e8df264829..25bba8b91e 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -294,7 +294,7 @@ void LC::cb_localcall() {
 
 	Datum nargs = g_lingo->pop();
 	if ((nargs.type == ARGC) || (nargs.type == ARGCNORET)) {
-		Symbol sym = g_lingo->_currentScriptContext->functions[functionId];
+		Symbol sym = g_lingo->_currentScriptContext->_functions[functionId];
 		if (debugChannelSet(3, kDebugLingoExec))
 			g_lingo->printSTUBWithArglist(sym.name->c_str(), nargs.u.i, "localcall:");
 
@@ -752,7 +752,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
 	_assemblyContext = new ScriptContext;
 	_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
 
-	_assemblyContext->name = !scriptName.empty() ? scriptName : Common::String::format("%d", id);
+	_assemblyContext->_name = !scriptName.empty() ? scriptName : Common::String::format("%d", id);
 
 	if (stream.size() < 0x5c) {
 		warning("Lscr header too small");
@@ -944,7 +944,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
 			break;
 		}
 
-		_assemblyContext->constants.push_back(constant);
+		_assemblyContext->_constants.push_back(constant);
 	}
 	free(constsStore);
 
@@ -1092,7 +1092,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
 					warning("Opcode 0x%02x arg %d not a multiple of 6!", opcode, arg);
 				}
 				arg /= 6;
-				Datum constant = _assemblyContext->constants[arg];
+				Datum constant = _assemblyContext->_constants[arg];
 				switch (constant.type) {
 				case INT:
 					g_lingo->code1(LC::c_intpush);
@@ -1266,7 +1266,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
 			out.writeString(Common::String::format("<end code>\n\n"));
 		}
 
-		_assemblyContext->functions.push_back(sym);
+		_assemblyContext->_functions.push_back(sym);
 		_currentAssembly = nullptr;
 	}
 
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 76b6c284ed..d47114a9bf 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -98,9 +98,9 @@ Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::
 
 		if (!_eventHandlerTypeIds.contains(name)) {
 			_archives[_assemblyArchive].functionHandlers[name] = sym;
-			_assemblyContext->functionHandlers[name] = sym;
+			_assemblyContext->_functionHandlers[name] = sym;
 		} else {
-			_assemblyContext->eventHandlers[_eventHandlerTypeIds[name]] = sym;
+			_assemblyContext->_eventHandlers[_eventHandlerTypeIds[name]] = sym;
 		}
 	}
 
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index afaa93c32c..187e7d95a8 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -161,7 +161,7 @@ void Lingo::registerSpriteEvent(LEvent event, int spriteId) {
 			}
 		} else {
 			ScriptContext *script = getScriptContext(kArchMain, kScoreScript, sprite->_scriptId);
-			if (script && script->eventHandlers.contains(event)) {
+			if (script && script->_eventHandlers.contains(event)) {
 				_eventQueue.push(LingoEvent(event, kArchMain, kScoreScript, sprite->_scriptId, spriteId));
 				return;
 			}
@@ -175,7 +175,7 @@ void Lingo::registerSpriteEvent(LEvent event, int spriteId) {
 		archiveIndex = kArchShared;
 		script = getScriptContext(archiveIndex, kCastScript, sprite->_castId);
 	}
-	if (script && script->eventHandlers.contains(event)) {
+	if (script && script->_eventHandlers.contains(event)) {
 		_eventQueue.push(LingoEvent(event, archiveIndex, kCastScript, sprite->_castId, spriteId));
 		return;
 	}
@@ -222,14 +222,14 @@ void Lingo::registerMovieEvent(LEvent event) {
 	// FIXME: shared cast movie scripts could come before main movie ones
 	for (ScriptContextHash::iterator it = _archives[kArchMain].scriptContexts[kMovieScript].begin();
 			it != _archives[kArchMain].scriptContexts[kMovieScript].end(); ++it) {
-		if (it->_value->eventHandlers.contains(event)) {
+		if (it->_value->_eventHandlers.contains(event)) {
 			_eventQueue.push(LingoEvent(event, kArchMain, kMovieScript, it->_key));
 			return;
 		}
 	}
 	for (ScriptContextHash::iterator it = _archives[kArchShared].scriptContexts[kMovieScript].begin();
 			it != _archives[kArchShared].scriptContexts[kMovieScript].end(); ++it) {
-		if (it->_value->eventHandlers.contains(event)) {
+		if (it->_value->_eventHandlers.contains(event)) {
 			_eventQueue.push(LingoEvent(event, kArchShared, kMovieScript, it->_key));
 			return;
 		}
@@ -303,9 +303,9 @@ void Lingo::processEvent(LEvent event, int archiveIndex, ScriptType st, int scri
 
 	ScriptContext *script = getScriptContext(archiveIndex, st, scriptId);
 
-	if (script && script->eventHandlers.contains(event)) {
+	if (script && script->_eventHandlers.contains(event)) {
 		debugC(1, kDebugEvents, "Lingo::processEvent(%s, %d, %s, %d): executing event handler", _eventHandlerTypes[event], archiveIndex, scriptType2str(st), scriptId);
-		LC::call(script->eventHandlers[event], 0);
+		LC::call(script->_eventHandlers[event], 0);
 		execute(_pc);
 	} else {
 		debugC(9, kDebugEvents, "Lingo::processEvent(%s, %d, %s, %d): no handler", _eventHandlerTypes[event], archiveIndex, scriptType2str(st), scriptId);
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index bf4bce2c5b..bbd18f8b89 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -898,12 +898,12 @@ static const yytype_int16 yyrline[] =
      600,   601,   602,   603,   604,   605,   606,   607,   608,   609,
      610,   612,   613,   614,   615,   616,   617,   618,   619,   621,
      624,   626,   627,   628,   629,   637,   638,   638,   639,   639,
-     640,   640,   641,   644,   647,   648,   650,   653,   657,   662,
-     668,   671,   682,   683,   684,   685,   689,   693,   698,   699,
-     701,   705,   709,   713,   713,   743,   743,   743,   749,   750,
-     750,   756,   764,   770,   770,   773,   774,   775,   777,   778,
-     779,   781,   783,   791,   792,   793,   795,   796,   798,   800,
-     801,   802,   803,   805,   806,   808,   809,   811,   815
+     640,   640,   641,   644,   647,   648,   650,   653,   657,   660,
+     664,   667,   678,   679,   680,   681,   685,   689,   694,   695,
+     697,   701,   705,   709,   709,   739,   739,   739,   745,   746,
+     746,   752,   760,   766,   766,   769,   770,   771,   773,   774,
+     775,   777,   779,   787,   788,   789,   791,   792,   794,   796,
+     797,   798,   799,   801,   802,   804,   805,   807,   811
 };
 #endif
 
@@ -3237,172 +3237,168 @@ yyreduce:
   case 128:
 #line 657 "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 3245 "engines/director/lingo/lingo-gr.cpp"
+#line 3243 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 662 "engines/director/lingo/lingo-gr.y"
+#line 660 "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 3255 "engines/director/lingo/lingo-gr.cpp"
+#line 3251 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 668 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3263 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3271 "engines/director/lingo/lingo-gr.cpp"
+#line 3267 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 682 "engines/director/lingo/lingo-gr.y"
+#line 678 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3277 "engines/director/lingo/lingo-gr.cpp"
+#line 3273 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 683 "engines/director/lingo/lingo-gr.y"
+#line 679 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3283 "engines/director/lingo/lingo-gr.cpp"
+#line 3279 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 680 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3289 "engines/director/lingo/lingo-gr.cpp"
+#line 3285 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 681 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3298 "engines/director/lingo/lingo-gr.cpp"
+#line 3294 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 689 "engines/director/lingo/lingo-gr.y"
+#line 685 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3307 "engines/director/lingo/lingo-gr.cpp"
+#line 3303 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 693 "engines/director/lingo/lingo-gr.y"
+#line 689 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3316 "engines/director/lingo/lingo-gr.cpp"
+#line 3312 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 697 "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 3325 "engines/director/lingo/lingo-gr.cpp"
+#line 3321 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 705 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3334 "engines/director/lingo/lingo-gr.cpp"
+#line 3330 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3343 "engines/director/lingo/lingo-gr.cpp"
+#line 3339 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3349 "engines/director/lingo/lingo-gr.cpp"
+#line 3345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3358 "engines/director/lingo/lingo-gr.cpp"
+#line 3354 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3364 "engines/director/lingo/lingo-gr.cpp"
+#line 3360 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3370 "engines/director/lingo/lingo-gr.cpp"
+#line 3366 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 744 "engines/director/lingo/lingo-gr.y"
+#line 740 "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 3380 "engines/director/lingo/lingo-gr.cpp"
+#line 3376 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 749 "engines/director/lingo/lingo-gr.y"
+#line 745 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3386 "engines/director/lingo/lingo-gr.cpp"
+#line 3382 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 746 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3392 "engines/director/lingo/lingo-gr.cpp"
+#line 3388 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 747 "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 3402 "engines/director/lingo/lingo-gr.cpp"
+#line 3398 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 756 "engines/director/lingo/lingo-gr.y"
+#line 752 "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));
@@ -3411,70 +3407,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3415 "engines/director/lingo/lingo-gr.cpp"
+#line 3411 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 764 "engines/director/lingo/lingo-gr.y"
+#line 760 "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 3425 "engines/director/lingo/lingo-gr.cpp"
+#line 3421 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 770 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3431 "engines/director/lingo/lingo-gr.cpp"
+#line 3427 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 770 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
-#line 3438 "engines/director/lingo/lingo-gr.cpp"
+#line 3434 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 773 "engines/director/lingo/lingo-gr.y"
+#line 769 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3444 "engines/director/lingo/lingo-gr.cpp"
+#line 3440 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 774 "engines/director/lingo/lingo-gr.y"
+#line 770 "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 3450 "engines/director/lingo/lingo-gr.cpp"
+#line 3446 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 157:
-#line 775 "engines/director/lingo/lingo-gr.y"
+#line 771 "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 3456 "engines/director/lingo/lingo-gr.cpp"
+#line 3452 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 778 "engines/director/lingo/lingo-gr.y"
+#line 774 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3462 "engines/director/lingo/lingo-gr.cpp"
+#line 3458 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 779 "engines/director/lingo/lingo-gr.y"
+#line 775 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3468 "engines/director/lingo/lingo-gr.cpp"
+#line 3464 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 781 "engines/director/lingo/lingo-gr.y"
+#line 777 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3474 "engines/director/lingo/lingo-gr.cpp"
+#line 3470 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 783 "engines/director/lingo/lingo-gr.y"
+#line 779 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3482,113 +3478,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3486 "engines/director/lingo/lingo-gr.cpp"
+#line 3482 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 791 "engines/director/lingo/lingo-gr.y"
+#line 787 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3492 "engines/director/lingo/lingo-gr.cpp"
+#line 3488 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 792 "engines/director/lingo/lingo-gr.y"
+#line 788 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3498 "engines/director/lingo/lingo-gr.cpp"
+#line 3494 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 793 "engines/director/lingo/lingo-gr.y"
+#line 789 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3504 "engines/director/lingo/lingo-gr.cpp"
+#line 3500 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 795 "engines/director/lingo/lingo-gr.y"
+#line 791 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3510 "engines/director/lingo/lingo-gr.cpp"
+#line 3506 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 796 "engines/director/lingo/lingo-gr.y"
+#line 792 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3516 "engines/director/lingo/lingo-gr.cpp"
+#line 3512 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 798 "engines/director/lingo/lingo-gr.y"
+#line 794 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3522 "engines/director/lingo/lingo-gr.cpp"
+#line 3518 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 800 "engines/director/lingo/lingo-gr.y"
+#line 796 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3528 "engines/director/lingo/lingo-gr.cpp"
+#line 3524 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 801 "engines/director/lingo/lingo-gr.y"
+#line 797 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3534 "engines/director/lingo/lingo-gr.cpp"
+#line 3530 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 802 "engines/director/lingo/lingo-gr.y"
+#line 798 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3540 "engines/director/lingo/lingo-gr.cpp"
+#line 3536 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 803 "engines/director/lingo/lingo-gr.y"
+#line 799 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3546 "engines/director/lingo/lingo-gr.cpp"
+#line 3542 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 805 "engines/director/lingo/lingo-gr.y"
+#line 801 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3552 "engines/director/lingo/lingo-gr.cpp"
+#line 3548 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 806 "engines/director/lingo/lingo-gr.y"
+#line 802 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3558 "engines/director/lingo/lingo-gr.cpp"
+#line 3554 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175:
-#line 808 "engines/director/lingo/lingo-gr.y"
+#line 804 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3564 "engines/director/lingo/lingo-gr.cpp"
+#line 3560 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176:
-#line 809 "engines/director/lingo/lingo-gr.y"
+#line 805 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3570 "engines/director/lingo/lingo-gr.cpp"
+#line 3566 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177:
-#line 811 "engines/director/lingo/lingo-gr.y"
+#line 807 "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 3579 "engines/director/lingo/lingo-gr.cpp"
+#line 3575 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 178:
-#line 815 "engines/director/lingo/lingo-gr.y"
+#line 811 "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 3588 "engines/director/lingo/lingo-gr.cpp"
+#line 3584 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3592 "engines/director/lingo/lingo-gr.cpp"
+#line 3588 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3787,7 +3783,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 821 "engines/director/lingo/lingo-gr.y"
+#line 817 "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 e88581adcb..8a5e4e2331 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -655,13 +655,9 @@ globallist: ID					{
 		delete $ID; }
 
 propertylist: ID				{
-		g_lingo->code1(LC::c_property);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarProperty);
 		delete $ID; }
 	| propertylist ',' ID		{
-		g_lingo->code1(LC::c_property);
-		g_lingo->codeString($ID->c_str());
 		mVar($ID, kVarProperty);
 		delete $ID; }
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 30ec24f2aa..a262e3ca6c 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -271,9 +271,9 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
 		_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
 
 	if (scriptName && strlen(scriptName) > 0)
-		_assemblyContext->name = Common::String(scriptName);
+		_assemblyContext->_name = Common::String(scriptName);
 	else
-		_assemblyContext->name = Common::String::format("%d", id);
+		_assemblyContext->_name = Common::String::format("%d", id);
 
 	_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
 	_linenumber = _colnumber = 1;
@@ -361,7 +361,7 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
 	currentFunc.type = HANDLER;
 	currentFunc.u.defn = _currentAssembly;
 	Common::String typeStr = Common::String(scriptType2str(type));
-	currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->name + "]");
+	currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->_name + "]");
 	currentFunc.ctx = _currentScriptContext;
 	currentFunc.archiveIndex = _assemblyArchive;
 	// arg names should be empty, but just in case
@@ -373,6 +373,8 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
 	for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = _methodVars->begin(); it != _methodVars->end(); ++it) {
 		if (it->_value == kVarLocal)
 			varNames->push_back(Common::String(it->_key));
+		else if (it->_value == kVarProperty)
+			_assemblyContext->_propNames.push_back(Common::String(it->_key));
 	}
 	delete _methodVars;
 	_methodVars = nullptr;
@@ -393,7 +395,7 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
 
 	currentFunc.argNames = argNames;
 	currentFunc.varNames = varNames;
-	_assemblyContext->eventHandlers[kEventNone] = currentFunc;
+	_assemblyContext->_eventHandlers[kEventNone] = currentFunc;
 	_assemblyContext = nullptr;
 	_currentAssembly = nullptr;
 	return sc;
@@ -572,7 +574,7 @@ void Lingo::executeScript(ScriptType type, uint16 id) {
 
 	debugC(1, kDebugLingoExec, "Executing script type: %s, id: %d", scriptType2str(type), id);
 
-	Symbol sym = sc->eventHandlers[kEventNone];
+	Symbol sym = sc->_eventHandlers[kEventNone];
 	LC::call(sym, 0);
 	execute(_pc);
 }
@@ -594,8 +596,8 @@ void Lingo::restartLingo(bool keepSharedCast) {
 		LingoArchive *arch = &_archives[a];
 		for (int i = 0; i <= kMaxScriptType; i++) {
 			for (ScriptContextHash::iterator it = arch->scriptContexts[i].begin(); it != arch->scriptContexts[i].end(); ++it) {
-				it->_value->eventHandlers.clear();
-				it->_value->functionHandlers.clear();
+				it->_value->_eventHandlers.clear();
+				it->_value->_functionHandlers.clear();
 				delete it->_value;
 			}
 
@@ -946,6 +948,22 @@ int Datum::compareTo(Datum &d, bool ignoreCase) {
 	}
 }
 
+Datum ScriptContext::getObject() {
+	if (_obj.type != OBJECT) {
+		_obj.type = OBJECT;
+		_obj.u.obj = new Object(_name, kScriptObj);
+		for (Common::Array<Common::String>::iterator it = _propNames.begin(); it != _propNames.end(); ++it) {
+			_obj.u.obj->properties[*it] = Datum();
+		}
+		for (SymbolHash::iterator it = _functionHandlers.begin(); it != _functionHandlers.end(); ++it) {
+			Symbol sym = it->_value;
+			sym.targetType = kScriptObj;
+			_obj.u.obj->methods[it->_key] = sym;
+		}
+	}
+	return _obj;
+}
+
 void Lingo::parseMenu(const char *code) {
 	warning("STUB: parseMenu");
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a80e67f88f..3c67e0db71 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -43,7 +43,7 @@ struct TheEntityField;
 struct LingoV4Bytecode;
 struct LingoV4TheEntity;
 struct Object;
-struct ScriptContext;
+class ScriptContext;
 class DirectorEngine;
 class Frame;
 
@@ -213,12 +213,19 @@ 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;
 
-struct ScriptContext {
-	Common::String name;
-	Common::Array<Symbol> functions; // used only by bytecode
-	Common::HashMap<uint32, Symbol> eventHandlers;
-	SymbolHash functionHandlers;
-	Common::Array<Datum> constants;
+class ScriptContext {
+public:
+	Common::String _name;
+	Common::Array<Symbol> _functions; // used only by bytecode
+	Common::HashMap<uint32, Symbol> _eventHandlers;
+	SymbolHash _functionHandlers;
+	Common::Array<Datum> _constants;
+	Common::Array<Common::String> _propNames;
+
+	Datum getObject();
+
+private:
+	Datum _obj;
 };
 
 enum ObjectType {
diff --git a/engines/director/score.h b/engines/director/score.h
index 20a1dcb57a..0c3c5258e4 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -225,6 +225,8 @@ public:
 
 	uint16 _framesRan; // used by kDebugFewFramesOnly
 
+	int _lingoArchive;
+
 private:
 	uint16 _versionMinor;
 	uint16 _versionMajor;
@@ -242,7 +244,6 @@ private:
 	uint16 _castArrayEnd;
 	uint16 _movieScriptCount;
 	Lingo *_lingo;
-	int _lingoArchive;
 	DirectorSound *_soundManager;
 	DirectorEngine *_vm;
 };




More information about the Scummvm-git-logs mailing list