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

djsrv dservilla at gmail.com
Fri Jul 30 00:26:34 UTC 2021


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

Summary:
f94363acc5 DIRECTOR: Fix pause
1e41097267 DIRECTOR: LINGO: Add error check to Object::initMethods
b57ae80ab1 DIRECTOR: LINGO: Keep track of open xlibs
4700f44dc4 DIRECTOR: LINGO: Implement closeXLib
f4bd3519c9 DIRECTOR: LINGO: Reload open xlibs in reloadBuiltIns


Commit: f94363acc54ac2067308491ef0674a581baacb38
    https://github.com/scummvm/scummvm/commit/f94363acc54ac2067308491ef0674a581baacb38
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00

Commit Message:
DIRECTOR: Fix pause

I accidentally removed "if (!_vm->_playbackPaused)" while figuring out
the logic for eded70bc8ab551adca581e0d6e3ab9f552fe3a3a.

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 5a1875472e..d69b9c9184 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -362,10 +362,12 @@ void Score::update() {
 	if (_playState == kPlayStopped)
 		return;
 
-	if (_nextFrame)
-		_currentFrame = _nextFrame;
-	else if (!_window->_newMovieStarted)
-		_currentFrame++;
+	if (!_vm->_playbackPaused) {
+		if (_nextFrame)
+			_currentFrame = _nextFrame;
+		else if (!_window->_newMovieStarted)
+			_currentFrame++;
+	}
 
 	_nextFrame = 0;
 


Commit: 1e41097267b13a68ee1313553ff144df9dacda6e
    https://github.com/scummvm/scummvm/commit/1e41097267b13a68ee1313553ff144df9dacda6e
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00

Commit Message:
DIRECTOR: LINGO: Add error check to Object::initMethods

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


diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 6534e7bcf5..39c6ee2cf5 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -86,6 +86,11 @@ protected:
 
 public:
 	static void initMethods(MethodProto protos[]) {
+		if (_methods) {
+			warning("Object::initMethods: Methods already initialized");
+			return;
+		}
+
 		_methods = new SymbolHash;
 		for (MethodProto *mtd = protos; mtd->name; mtd++) {
 			if (mtd->version > g_lingo->_vm->getVersion())


Commit: b57ae80ab13cceafb4ce0eb27e56fbd7b60ac961
    https://github.com/scummvm/scummvm/commit/b57ae80ab13cceafb4ce0eb27e56fbd7b60ac961
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00

Commit Message:
DIRECTOR: LINGO: Keep track of open xlibs

Changed paths:
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h
    engines/director/lingo/xlibs/fileio.cpp
    engines/director/lingo/xlibs/flushxobj.cpp
    engines/director/lingo/xlibs/fplayxobj.cpp
    engines/director/lingo/xlibs/labeldrvxobj.cpp
    engines/director/lingo/xlibs/palxobj.cpp
    engines/director/lingo/xlibs/soundjam.cpp
    engines/director/lingo/xlibs/winxobj.cpp


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 9bebf22403..648a4aa4b2 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -159,6 +159,11 @@ void Lingo::openXLib(Common::String name, ObjectType type) {
 	name.toLowercase();
 	name.trim();
 
+	if (_openXLibs[name])
+		return;
+
+	_openXLibs[name] = true;
+
 	if (_xlibInitializers.contains(name)) {
 		Symbol sym = _xlibInitializers[name];
 		(*sym.u.bltin)(type);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index ff42f08239..68c5629ab7 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -209,6 +209,7 @@ typedef Common::HashMap<Common::String, Symbol, Common::IgnoreCase_Hash, Common:
 typedef Common::HashMap<Common::String, Datum, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> DatumHash;
 typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> BuiltinHash;
 typedef Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> VarTypeHash;
+typedef Common::HashMap<Common::String, bool, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
 
 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;
@@ -409,6 +410,8 @@ public:
 	SymbolHash _methods;
 	SymbolHash _xlibInitializers;
 
+	OpenXLibsHash _openXLibs;
+
 	Common::String _floatPrecisionFormat;
 
 public:
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index 49b5068c82..d496e109d4 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -51,14 +51,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void FileIO::initialize(int type) {
-	FileObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			FileObject *xobj = new FileObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("FileIO XObject already initialized");
-		}
+		FileObject::initMethods(xlibMethods);
+		FileObject *xobj = new FileObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 	if (type & kXtraObj) {
 		// TODO - Implement Xtra
diff --git a/engines/director/lingo/xlibs/flushxobj.cpp b/engines/director/lingo/xlibs/flushxobj.cpp
index 6527275eca..fa31b9db6d 100644
--- a/engines/director/lingo/xlibs/flushxobj.cpp
+++ b/engines/director/lingo/xlibs/flushxobj.cpp
@@ -54,14 +54,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void FlushXObj::initialize(int type) {
-	FlushXObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			FlushXObject *xobj = new FlushXObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("FlushXObject already initialized");
-		}
+		FlushXObject::initMethods(xlibMethods);
+		FlushXObject *xobj = new FlushXObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index fa2ddc7bc8..a4f0533c8e 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -50,11 +50,7 @@ static BuiltinProto builtins[] = {
 };
 
 void FPlayXObj::initialize(int type) {
-	if (!g_lingo->_builtinCmds.contains("FPlay")) {
-		g_lingo->initBuiltIns(builtins);
-	} else {
-		warning("FPlayXObj already initialized");
-	}
+	g_lingo->initBuiltIns(builtins);
 }
 
 void FPlayXObj::b_fplay(int nargs) {
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.cpp b/engines/director/lingo/xlibs/labeldrvxobj.cpp
index a058abad2a..5514c0c959 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.cpp
+++ b/engines/director/lingo/xlibs/labeldrvxobj.cpp
@@ -54,14 +54,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void LabelDrvXObj::initialize(int type) {
-	LabelDrvXObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("LabelDrvXObj already initialized");
-		}
+		LabelDrvXObject::initMethods(xlibMethods);
+		LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
diff --git a/engines/director/lingo/xlibs/palxobj.cpp b/engines/director/lingo/xlibs/palxobj.cpp
index a587ab0a30..206fa2c200 100644
--- a/engines/director/lingo/xlibs/palxobj.cpp
+++ b/engines/director/lingo/xlibs/palxobj.cpp
@@ -55,14 +55,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void PalXObj::initialize(int type) {
-	PalXObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			PalXObject *xobj = new PalXObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("PalXObject already initialized");
-		}
+		PalXObject::initMethods(xlibMethods);
+		PalXObject *xobj = new PalXObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
diff --git a/engines/director/lingo/xlibs/soundjam.cpp b/engines/director/lingo/xlibs/soundjam.cpp
index 045ec145ba..218dc26408 100644
--- a/engines/director/lingo/xlibs/soundjam.cpp
+++ b/engines/director/lingo/xlibs/soundjam.cpp
@@ -70,14 +70,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void SoundJam::initialize(int type) {
-	SoundJamObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			SoundJamObject *xobj = new SoundJamObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("SoundJam already initialized");
-		}
+		SoundJamObject::initMethods(xlibMethods);
+		SoundJamObject *xobj = new SoundJamObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
diff --git a/engines/director/lingo/xlibs/winxobj.cpp b/engines/director/lingo/xlibs/winxobj.cpp
index 4650c16aec..8b9ed9b7fc 100644
--- a/engines/director/lingo/xlibs/winxobj.cpp
+++ b/engines/director/lingo/xlibs/winxobj.cpp
@@ -48,14 +48,10 @@ static MethodProto xlibMethods[] = {
 };
 
 void RearWindowXObj::initialize(int type) {
-	RearWindowXObject::initMethods(xlibMethods);
 	if (type & kXObj) {
-		if (!g_lingo->_globalvars.contains(xlibName)) {
-			RearWindowXObject *xobj = new RearWindowXObject(kXObj);
-			g_lingo->_globalvars[xlibName] = xobj;
-		} else {
-			warning("RearWindowXObject already initialized");
-		}
+		RearWindowXObject::initMethods(xlibMethods);
+		RearWindowXObject *xobj = new RearWindowXObject(kXObj);
+		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 


Commit: 4700f44dc49cd7a4556233b6bfffde677033800f
    https://github.com/scummvm/scummvm/commit/4700f44dc49cd7a4556233b6bfffde677033800f
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00

Commit Message:
DIRECTOR: LINGO: Implement closeXLib

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.h
    engines/director/lingo/xlibs/fileio.cpp
    engines/director/lingo/xlibs/fileio.h
    engines/director/lingo/xlibs/flushxobj.cpp
    engines/director/lingo/xlibs/flushxobj.h
    engines/director/lingo/xlibs/fplayxobj.cpp
    engines/director/lingo/xlibs/fplayxobj.h
    engines/director/lingo/xlibs/labeldrvxobj.cpp
    engines/director/lingo/xlibs/labeldrvxobj.h
    engines/director/lingo/xlibs/palxobj.cpp
    engines/director/lingo/xlibs/palxobj.h
    engines/director/lingo/xlibs/soundjam.cpp
    engines/director/lingo/xlibs/soundjam.h
    engines/director/lingo/xlibs/winxobj.cpp
    engines/director/lingo/xlibs/winxobj.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 87d4dc3632..2ec16558bb 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -275,6 +275,27 @@ void Lingo::cleanupBuiltIns() {
 	_builtinConsts.clear();
 }
 
+void Lingo::cleanupBuiltIns(BuiltinProto protos[]) {
+	for (BuiltinProto *blt = protos; blt->name; blt++) {
+		switch (blt->type) {
+		case CBLTIN:
+			_builtinCmds.erase(blt->name);
+			break;
+		case FBLTIN:
+			_builtinFuncs.erase(blt->name);
+			break;
+		case HBLTIN:
+			_builtinCmds.erase(blt->name);
+			_builtinFuncs.erase(blt->name);
+			break;
+		case KBLTIN:
+			_builtinConsts.erase(blt->name);
+		default:
+			break;
+		}
+	}
+}
+
 void Lingo::printSTUBWithArglist(const char *funcname, int nargs, const char *prefix) {
 	Common::String s(funcname);
 
@@ -1040,8 +1061,8 @@ void LB::b_closeResFile(int nargs) {
 
 void LB::b_closeXlib(int nargs) {
 	Datum d = g_lingo->pop();
-
-	warning("STUB: b_closeXlib(%s)", d.asString().c_str());
+	Common::String xlibName = d.asString();
+	g_lingo->closeXLib(xlibName);
 }
 
 void LB::b_getNthFileNameInFolder(int nargs) {
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 648a4aa4b2..064669f098 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -107,18 +107,19 @@ void Lingo::cleanupMethods() {
 
 static struct XLibProto {
 	const char *name;
-	void (*initializer)(int);
+	void (*opener)(int);
+	void (*closer)(int);
 	int type;
 	int version;
 } xlibs[] = {
-	{ "FileIO",					FileIO::initialize,					kXObj | kXtraObj,		200 },	// D2
-	{ "FlushXObj",				FlushXObj::initialize,				kXObj,					400 },	// D4
-	{ "FPlayXObj",				FPlayXObj::initialize,				kXObj,					200 },	// D2
-	{ "PalXObj",				PalXObj:: initialize,				kXObj,					400 }, 	// D4
-	{ "LabelDrv",				LabelDrvXObj:: initialize,			kXObj,					400 }, 	// D4
-	{ "SoundJam",				SoundJam::initialize,				kXObj,					400 },	// D4
-	{ "winXObj",				RearWindowXObj::initialize,			kXObj,					400 },	// D4
-	{ 0, 0, 0, 0 }
+	{ "FileIO",					FileIO::open,			FileIO::close,				kXObj | kXtraObj,		200 },	// D2
+	{ "FlushXObj",				FlushXObj::open,		FlushXObj::close,			kXObj,					400 },	// D4
+	{ "FPlayXObj",				FPlayXObj::open,		FPlayXObj::close,			kXObj,					200 },	// D2
+	{ "PalXObj",				PalXObj::open,			PalXObj::close,				kXObj,					400 }, 	// D4
+	{ "LabelDrv",				LabelDrvXObj::open,		LabelDrvXObj::close,		kXObj,					400 }, 	// D4
+	{ "SoundJam",				SoundJam::open,			SoundJam::close,			kXObj,					400 },	// D4
+	{ "winXObj",				RearWindowXObj::open,	RearWindowXObj::close,		kXObj,					400 },	// D4
+	{ 0, 0, 0, 0, 0 }
 
 };
 
@@ -127,25 +128,32 @@ void Lingo::initXLibs() {
 		if (lib->version > _vm->getVersion())
 			continue;
 
-		Symbol sym;
-		sym.name = new Common::String(lib->name);
-		sym.type = HBLTIN;
-		sym.nargs = 0;
-		sym.maxArgs = 0;
-		sym.targetType = lib->type;
-		sym.u.bltin = lib->initializer;
-		Common::String xlibName = lib->name;
-		xlibName.toLowercase();
-		_xlibInitializers[xlibName] = sym;
+		Symbol openSym;
+		openSym.name = new Common::String(lib->name);
+		openSym.type = HBLTIN;
+		openSym.nargs = 0;
+		openSym.maxArgs = 0;
+		openSym.targetType = lib->type;
+		openSym.u.bltin = lib->opener;
+		_xlibOpeners[lib->name] = openSym;
+
+		Symbol closeSym;
+		closeSym.name = new Common::String(lib->name);
+		closeSym.type = HBLTIN;
+		closeSym.nargs = 0;
+		closeSym.maxArgs = 0;
+		openSym.targetType = lib->type;
+		closeSym.u.bltin = lib->closer;
+		_xlibClosers[lib->name] = closeSym;
 	}
 }
 
 void Lingo::cleanupXLibs() {
-	_xlibInitializers.clear();
+	_xlibOpeners.clear();
+	_xlibClosers.clear();
 }
 
-void Lingo::openXLib(Common::String name, ObjectType type) {
-
+Common::String Lingo::normalizeXLibName(Common::String name) {
 	Common::Platform platform = _vm->getPlatform();
 	if (platform == Common::kPlatformMacintosh) {
 		int pos = name.findLastOf(':');
@@ -155,20 +163,43 @@ void Lingo::openXLib(Common::String name, ObjectType type) {
 			name = name.substr(0, name.size() - 4);
 	}
 
-	// normalize xlib name
-	name.toLowercase();
 	name.trim();
 
-	if (_openXLibs[name])
+	return name;
+}
+
+void Lingo::openXLib(Common::String name, ObjectType type) {
+	name = normalizeXLibName(name);
+
+	if (_openXLibs.contains(name))
 		return;
 
-	_openXLibs[name] = true;
+	_openXLibs[name] = type;
+
+	if (_xlibOpeners.contains(name)) {
+		Symbol sym = _xlibOpeners[name];
+		(*sym.u.bltin)(type);
+	} else {
+		warning("Lingo::openXLib: Unimplemented xlib: '%s'", name.c_str());
+	}
+}
+
+void Lingo::closeXLib(Common::String name) {
+	name = normalizeXLibName(name);
+
+	if (!_openXLibs.contains(name)) {
+		warning("Lingo::closeXLib: xlib %s is not open", name.c_str());
+		return;
+	}
+
+	ObjectType type = _openXLibs[name];
+	_openXLibs.erase(name);
 
-	if (_xlibInitializers.contains(name)) {
-		Symbol sym = _xlibInitializers[name];
+	if (_xlibClosers.contains(name)) {
+		Symbol sym = _xlibClosers[name];
 		(*sym.u.bltin)(type);
 	} else {
-		warning("Unimplemented xlib: '%s'", name.c_str());
+		warning("Lingo::closeXLib: Unimplemented xlib: '%s'", name.c_str());
 	}
 }
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 68c5629ab7..4ad617e710 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -209,7 +209,7 @@ typedef Common::HashMap<Common::String, Symbol, Common::IgnoreCase_Hash, Common:
 typedef Common::HashMap<Common::String, Datum, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> DatumHash;
 typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> BuiltinHash;
 typedef Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> VarTypeHash;
-typedef Common::HashMap<Common::String, bool, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
+typedef Common::HashMap<Common::String, ObjectType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
 
 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;
@@ -283,6 +283,7 @@ public:
 	void initBuiltIns();
 	void initBuiltIns(BuiltinProto protos[]);
 	void cleanupBuiltIns();
+	void cleanupBuiltIns(BuiltinProto protos[]);
 	void initFuncs();
 	void cleanupFuncs();
 	void initBytecode();
@@ -290,7 +291,10 @@ public:
 	void cleanupMethods();
 	void initXLibs();
 	void cleanupXLibs();
+
+	Common::String normalizeXLibName(Common::String name);
 	void openXLib(Common::String name, ObjectType type);
+	void closeXLib(Common::String name);
 
 	void runTests();
 
@@ -408,7 +412,8 @@ public:
 	SymbolHash _builtinFuncs;
 	SymbolHash _builtinConsts;
 	SymbolHash _methods;
-	SymbolHash _xlibInitializers;
+	SymbolHash _xlibOpeners;
+	SymbolHash _xlibClosers;
 
 	OpenXLibsHash _openXLibs;
 
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index d496e109d4..6f34901cce 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -50,13 +50,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void FileIO::initialize(int type) {
-	if (type & kXObj) {
+void FileIO::open(int type) {
+	if (type == kXObj) {
 		FileObject::initMethods(xlibMethods);
 		FileObject *xobj = new FileObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
+	} else if (type == kXtraObj) {
+		// TODO - Implement Xtra
 	}
-	if (type & kXtraObj) {
+}
+
+void FileIO::close(int type) {
+	if (type == kXObj) {
+		FileObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	} else if (type == kXtraObj) {
 		// TODO - Implement Xtra
 	}
 }
diff --git a/engines/director/lingo/xlibs/fileio.h b/engines/director/lingo/xlibs/fileio.h
index 23a4963303..361034468d 100644
--- a/engines/director/lingo/xlibs/fileio.h
+++ b/engines/director/lingo/xlibs/fileio.h
@@ -68,8 +68,10 @@ public:
 };
 
 namespace FileIO {
+	void open(int type);
+	void close(int type);
+
 	bool charInMatchString(char ch, const Common::String &matchString);
-	void initialize(int type);
 	void saveFileError();
 	void m_delete(int nargs);
 	void m_dispose(int nargs);
diff --git a/engines/director/lingo/xlibs/flushxobj.cpp b/engines/director/lingo/xlibs/flushxobj.cpp
index fa31b9db6d..2b9837da8c 100644
--- a/engines/director/lingo/xlibs/flushxobj.cpp
+++ b/engines/director/lingo/xlibs/flushxobj.cpp
@@ -53,14 +53,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void FlushXObj::initialize(int type) {
-	if (type & kXObj) {
+void FlushXObj::open(int type) {
+	if (type == kXObj) {
 		FlushXObject::initMethods(xlibMethods);
 		FlushXObject *xobj = new FlushXObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
+void FlushXObj::close(int type) {
+	if (type == kXObj) {
+		FlushXObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	}
+}
+
 
 FlushXObject::FlushXObject(ObjectType ObjectType) :Object<FlushXObject>("FlushXObj") {
 	_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/flushxobj.h b/engines/director/lingo/xlibs/flushxobj.h
index a23f36c1c4..f1556a93ce 100644
--- a/engines/director/lingo/xlibs/flushxobj.h
+++ b/engines/director/lingo/xlibs/flushxobj.h
@@ -32,7 +32,8 @@ public:
 
 namespace FlushXObj {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void m_new(int nargs);
 void m_clearMask(int nargs);
diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index a4f0533c8e..f330bc10a8 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -49,10 +49,14 @@ static BuiltinProto builtins[] = {
 	{ 0, 0, 0, 0, 0, VOIDSYM }
 };
 
-void FPlayXObj::initialize(int type) {
+void FPlayXObj::open(int type) {
 	g_lingo->initBuiltIns(builtins);
 }
 
+void FPlayXObj::close(int type) {
+	g_lingo->cleanupBuiltIns(builtins);
+}
+
 void FPlayXObj::b_fplay(int nargs) {
 	if (nargs == 0) {
 		warning("FPlayXObj::b_fplay: requires at least one argument");
diff --git a/engines/director/lingo/xlibs/fplayxobj.h b/engines/director/lingo/xlibs/fplayxobj.h
index 1cc977bbf5..5798f43607 100644
--- a/engines/director/lingo/xlibs/fplayxobj.h
+++ b/engines/director/lingo/xlibs/fplayxobj.h
@@ -27,7 +27,8 @@ namespace Director {
 
 namespace FPlayXObj {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void b_fplay(int nargs);
 void b_sndinfo(int nargs);
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.cpp b/engines/director/lingo/xlibs/labeldrvxobj.cpp
index 5514c0c959..51d4c60266 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.cpp
+++ b/engines/director/lingo/xlibs/labeldrvxobj.cpp
@@ -53,14 +53,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void LabelDrvXObj::initialize(int type) {
-	if (type & kXObj) {
+void LabelDrvXObj::open(int type) {
+	if (type == kXObj) {
 		LabelDrvXObject::initMethods(xlibMethods);
 		LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
+void LabelDrvXObj::close(int type) {
+	if (type == kXObj) {
+		LabelDrvXObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	}
+}
+
 LabelDrvXObject::LabelDrvXObject(ObjectType ObjectType) :Object<LabelDrvXObject>("LabelDrvXObj") {
 	_objType = ObjectType;
 }
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.h b/engines/director/lingo/xlibs/labeldrvxobj.h
index d7a03e5963..8eaddd5fed 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.h
+++ b/engines/director/lingo/xlibs/labeldrvxobj.h
@@ -35,7 +35,8 @@ public:
 
 namespace LabelDrvXObj {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void m_new(int nargs);
 void m_setRange(int nargs);
diff --git a/engines/director/lingo/xlibs/palxobj.cpp b/engines/director/lingo/xlibs/palxobj.cpp
index 206fa2c200..f10a16d287 100644
--- a/engines/director/lingo/xlibs/palxobj.cpp
+++ b/engines/director/lingo/xlibs/palxobj.cpp
@@ -54,14 +54,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void PalXObj::initialize(int type) {
-	if (type & kXObj) {
+void PalXObj::open(int type) {
+	if (type == kXObj) {
 		PalXObject::initMethods(xlibMethods);
 		PalXObject *xobj = new PalXObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
+void PalXObj::close(int type) {
+	if (type == kXObj) {
+		PalXObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	}
+}
+
 
 PalXObject::PalXObject(ObjectType ObjectType) :Object<PalXObject>("PalXObj") {
 	_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/palxobj.h b/engines/director/lingo/xlibs/palxobj.h
index 4da3408320..70da86adb3 100644
--- a/engines/director/lingo/xlibs/palxobj.h
+++ b/engines/director/lingo/xlibs/palxobj.h
@@ -35,7 +35,8 @@ public:
 
 namespace PalXObj {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void m_new(int nargs);
 void m_patchIt(int nargs);
diff --git a/engines/director/lingo/xlibs/soundjam.cpp b/engines/director/lingo/xlibs/soundjam.cpp
index 218dc26408..8846adefbf 100644
--- a/engines/director/lingo/xlibs/soundjam.cpp
+++ b/engines/director/lingo/xlibs/soundjam.cpp
@@ -69,14 +69,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void SoundJam::initialize(int type) {
-	if (type & kXObj) {
+void SoundJam::open(int type) {
+	if (type == kXObj) {
 		SoundJamObject::initMethods(xlibMethods);
 		SoundJamObject *xobj = new SoundJamObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
+void SoundJam::close(int type) {
+	if (type == kXObj) {
+		SoundJamObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	}
+}
+
 SoundJamObject::SoundJamObject(ObjectType objType) : Object<SoundJamObject>("SoundJam") {
 	_objType = objType;
 }
diff --git a/engines/director/lingo/xlibs/soundjam.h b/engines/director/lingo/xlibs/soundjam.h
index cc3344c71d..76f892839e 100644
--- a/engines/director/lingo/xlibs/soundjam.h
+++ b/engines/director/lingo/xlibs/soundjam.h
@@ -32,7 +32,8 @@ public:
 
 namespace SoundJam {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void m_new(int nargs);
 void m_defineFileSound(int nargs);
diff --git a/engines/director/lingo/xlibs/winxobj.cpp b/engines/director/lingo/xlibs/winxobj.cpp
index 8b9ed9b7fc..c9f298b899 100644
--- a/engines/director/lingo/xlibs/winxobj.cpp
+++ b/engines/director/lingo/xlibs/winxobj.cpp
@@ -47,14 +47,21 @@ static MethodProto xlibMethods[] = {
 	{ 0, 0, 0, 0, 0 }
 };
 
-void RearWindowXObj::initialize(int type) {
-	if (type & kXObj) {
+void RearWindowXObj::open(int type) {
+	if (type == kXObj) {
 		RearWindowXObject::initMethods(xlibMethods);
 		RearWindowXObject *xobj = new RearWindowXObject(kXObj);
 		g_lingo->_globalvars[xlibName] = xobj;
 	}
 }
 
+void RearWindowXObj::close(int type) {
+	if (type == kXObj) {
+		RearWindowXObject::cleanupMethods();
+		g_lingo->_globalvars[xlibName] = Datum();
+	}
+}
+
 
 RearWindowXObject::RearWindowXObject(ObjectType ObjectType) :Object<RearWindowXObject>("RearWindowXObj") {
 	_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/winxobj.h b/engines/director/lingo/xlibs/winxobj.h
index c37de5d881..c58dbaae66 100644
--- a/engines/director/lingo/xlibs/winxobj.h
+++ b/engines/director/lingo/xlibs/winxobj.h
@@ -33,7 +33,8 @@ public:
 
 namespace RearWindowXObj {
 
-void initialize(int type);
+void open(int type);
+void close(int type);
 
 void m_new(int nargs);
 void m_getMemoryNeeded(int nargs);


Commit: f4bd3519c96ab7185c413ca7d8817b9be7572c27
    https://github.com/scummvm/scummvm/commit/f4bd3519c96ab7185c413ca7d8817b9be7572c27
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00

Commit Message:
DIRECTOR: LINGO: Reload open xlibs in reloadBuiltIns

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


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 064669f098..bef55274dc 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -203,6 +203,14 @@ void Lingo::closeXLib(Common::String name) {
 	}
 }
 
+void Lingo::reloadOpenXLibs() {
+	OpenXLibsHash openXLibsCopy = _openXLibs;
+	for (OpenXLibsHash::iterator it = openXLibsCopy.begin(); it != openXLibsCopy.end(); ++it) {
+		closeXLib(it->_key);
+		openXLib(it->_key, it->_value);
+	}
+}
+
 // Initialization/disposal
 
 void LM::m_new(int nargs) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index c0b3e3f577..a81374f6b8 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -204,6 +204,7 @@ void Lingo::reloadBuiltIns() {
 	initTheEntities();
 	initMethods();
 	initXLibs();
+	reloadOpenXLibs();
 }
 
 LingoArchive::~LingoArchive() {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 4ad617e710..7162a29c43 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -295,6 +295,7 @@ public:
 	Common::String normalizeXLibName(Common::String name);
 	void openXLib(Common::String name, ObjectType type);
 	void closeXLib(Common::String name);
+	void reloadOpenXLibs();
 
 	void runTests();
 




More information about the Scummvm-git-logs mailing list